为ETS表提供数据,info / 1函数返回表的各种属性,包括 size 值,该值特定于行数而不是物理大小。
有没有办法计算ETS表占用的内存量?
ets:new( mytable, [bag, named_table, compressed]),
ets:insert( mytable, { Key, Value } ),
....
ets:info ( mytable ).
答案 0 :(得分:14)
<强> 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表initially spans 768 words,你必须添加每个元素的大小,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)分配给数据。
只有13个字(104字节)的结构开销(或者看起来似乎,它仍然模糊)来自报告的增加erlang:memory/1
,所以ets:info/2
毕竟是相当准确的。
在插入一个由2个原子组成的简单元组后,erlang:memory/1
报告了8字内存分配增加,就像文档所说的那样(新的ETS记录:6个字+数据大小 - 2个在此案例:每个原子1个字。)
答案 1 :(得分:1)