rad*_*row 3 erlang ets data-structures
我知道(至少)有三种方法可以在 Erlang 中实现可变状态:
persistent_term
它们的基本用法与我看起来非常相似:
% ETS
1> ets:new(table1, [named_table]).
2> ets:insert(table1, {thing}).
3> ets:lookup(table1, thing).
[{thing}]
% persistent_term
1> persistent_term:put(table2, thing).
2> persistent_term:get(table2).
thing
% Process dictionary
1> put(table3, thing).
2> get(table3).
thing
Run Code Online (Sandbox Code Playgroud)
使用其中一种与另一种有什么区别和优缺点?
我发现 ETS 的行为更像是映射,但它与将映射保存在persistent_term
s 或过程字典中有何不同?
persistent_term
并ets
公开类似的 API,但它们是不同的,我将引用手册:
持久术语是一项高级功能,并不是 ETS 表的一般替代品。
差异在于术语存储在何处以及更新时发生的情况,ETS 术语在读取时复制到进程堆,其中persistent_term
术语仅被引用。这导致当更新其中的项目时persistent_term
,拥有该术语的副本(引用)的所有进程都需要将其实际复制到堆中才能继续使用它。
对于大量的术语,引用它们而不是复制它们可以节省大量时间,但更新的惩罚是严厉的。
此外,persistent_term
它只是一个映射,而 ETS 可以是集合、有序集、包或重复包,ETS 也提供选择和匹配语义。
它persistent_term
被用作 ETS 所使用的非常具体的用例的优化替代品。
关于进程字典,它是#{}
进程内部的本地字典,始终可用。ETS 和persistent_term
可用于每个进程,本地进程字典对于每个进程都是不同的。使用进程字典时要非常小心,因为它会影响可读性。