gpt4 book ai didi

caching - 如何存储模块级一次性写入状态?

转载 作者:行者123 更新时间:2023-12-02 10:08:59 25 4
gpt4 key购买 nike

我有一些模块级状态,我想编写一次,然后永远不会修改。

具体来说,我有一组字符串,我想用来稍后查找内容。执行此操作的有效且普通的方法是什么?

我可以创建一个始终返回相同集合的函数:

my_set() -> sets:from_list(["a", "b", "c"]).

虚拟机会对此进行优化,还是每次都会重新运行构建集合的代码?我怀疑这个套装只会获得 GCd。

在这种情况下,我应该将集合缓存在进程字典中,并以诸如模块 md5 之类的独特内容为键吗?

Key = proplists:get_value(md5, module_info()), put(Key, my_set())

另一种解决方案是让调用者调用 init 函数来获取不透明的状态 block ,然后将该状态传递到模块中的每个函数中。

最佳答案

编译时常量,如示例列表["a", "b", "c"],将在加载模块时存储在侧面的常量池中,并且不会在每次运行表达式时重建。 (在过去,列表将根据每个新调用的元素进行重建。)这适用于所有常量,无论多么复杂(例如元组列表的列表)。但是,当您调用像sets:from_list/1这样的函数时,编译器无法假设有关sets模块使用的表示的任何信息,并且集合将从该常量列表动态构造。

虽然 ETS 表可以工作,但对于较大的常量(例如,包含许多条目的集合或映射)效率较低,因为 ETS 表具有与进程相同的内存模型 - 数据由以下进程写入和读取复制,就像发送消息一样。如果常量很小,则复制它们和在本地重新创建它们之间的差异可以忽略不计,如果常量很大,则复制它们会浪费时间。

您想要的是一个相当新的功能,称为持久术语存储:https://erlang.org/doc/man/persistent_term.html (自 Erlang/OTP 21 起)。它类似于编译时常量的处理方式,因此在查找值时没有复制。 (关键可能是你的模块的名称。)持久性术语几乎是一个一次写入多次读取的存储 - 你可以更新存储的条目,但这是一个更昂贵的操作,可能会触发全局GC。

关于caching - 如何存储模块级一次性写入状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62011643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com