如何确定ETS表格的确切内存大小



给一个包含数据的ETS表,info/1函数返回该表的各种属性,包括一个特定于行数而非物理大小的size值。

有没有办法计算ETS表占用的内存量(以字节为单位)?

ets:new( mytable, [bag, named_table, compressed]),
ets:insert( mytable, { Key, Value } ),
....
ets:info ( mytable ).

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)立即获得正确的字大小)

  • 32位系统上,一个字是4字节(32位)
  • 64位系统上,一个字是8字节(64位)

还要注意,ETS表最初跨越768个单词,必须添加每个元素的大小,即6个单词+Erlang数据的大小。目前还不清楚这些词是否是ets:info指定的"分配给数据"。

计算确切的大小有点麻烦:ETS表有自己独立的内存管理系统,该系统经过优化和垃圾收集,并且可能因表类型(setbagduplicate_bag)而异。作为一个实验,在我的环境中,一个空表返回300个单词"allocated to data"。如果我添加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个字)。

您可以阅读有关ets的文档。

您可以使用它来获得分配给该表的内存。ets:信息(mytable,内存)。

{memory,integer()>=0分配给表的字数。

相关内容

  • 没有找到相关文章

最新更新