繁体   English   中英

如何识别ETS表的确切内存大小?

[英]How to identify the exact memory size of an ETS table?

给具有数据的ETS表中,方式/ 1函数返回表中的各种属性,包括一个尺寸值是特定于行数,而不是实际尺寸。

有没有办法计算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个“分配给数据”的单词。 如果我添加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/1erlang: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每个原子的单词)。

你可以阅读有关ets的文件。

你可以使用它来获取分配给表的内存。 ets:info(mytable,memory)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM