给具有数据的ETS表中,方式/ 1函数返回表中的各种属性,包括一个尺寸值是特定于行数,而不是实际尺寸.
有没有办法计算ETS表占用的内存量?
ets:new( mytable, [bag, named_table, compressed]),
ets:insert( mytable, { Key, Value } ),
....
ets:info ( mytable ).
Run Code Online (Sandbox Code Playgroud)
Ber*_*mus 16
TL; DR:
ETS表分配的内存大小以字节为单位:
ets:info(Table,memory) * erlang:system_info(wordsize).
为了详细说明,ets:info(Table,memory)给出了在ETS表中分配给数据的单词(对于Mnesia也是如此.您可以在TV应用程序中查看该信息.DETS表的相同属性以字节为单位).
一个词只不过是特定CPU架构的"自然"数据单元.代表什么取决于您的架构:32位或64位(或用于erlang:system_info(wordsize)立即获得正确的字大小)
另请注意,ETS表最初跨越768个单词,您必须添加每个元素的大小,6个单词+大小的Erlang数据.这些是"分配给数据" ets:info指定的词语并不十分清楚.
计算的确切大小是有点麻烦的:ETS表具有自己独立的存储器管理系统,其被优化和垃圾回收,并且可以根据表型(变化set,bag,duplicate_bag).作为一个实验,一个空表在我的环境中返回300个"分配给数据"的单词.如果我添加11个元组,则大小增加到366个单词.根据定义,不知道那些与最初的768个单词有什么关系,或者为什么大小只会增加11*6个单词,而它应该是11*6 + 11*1(11个原子).
仍然,一个简单的估计,取初始表大小和分配给数据的单词,例如22086字,导致768*8 + 22.086*8 = 182.832字节(178.54 KiB).
当然,数据越大,那些"结构"单词就越少,所以你只能使用"返回数据的单词"数字ets:info来估计你的表在内存中的大小.
编辑:还有两个其他功能可以让您审核ETS内存使用情况:
erlang:memory/1:erlang:memory(ets)返回分配给ETS的内存大小(以字节为单位).ets:i/0:所有活动ETS表的概述(有点像查看系统表TV,但有类型和内存数据).作为一个小测试,一个新创建的空表增加了内存使用312字(2.44 KiB),比手册中的768号少很多(也许它的CPU架构相关,我不知道),而ETS本身报告了299个字(2.33 KiB)分配给数据.
从erlang:memory/1报告的增加开始,只有13个字(104字节)的结构开销(或者看起来,它仍然是模糊的),所以ets:info/2毕竟是相当准确的.
在插入一个由2个原子组成的简单元组后,erlang:memory/1报告了8字内存分配增加,就像文档所说的那样(新的ETS记录:6个字+数据大小 - 在这种情况下为2:每个原子1个字).