【问题标题】:How to identify the exact memory size of an ETS table?如何确定 ETS 表的确切内存大小?
【发布时间】:2014-03-25 06:56:24
【问题描述】:

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

有什么方法可以计算 ETS 表占用的内存量(以字节为单位)?

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

【问题讨论】:

    标签: erlang ets


    【解决方案1】:

    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 表 initially spans 768 words,您必须添加每个元素的大小,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)。

    与报告的erlang:memory/1 增加相比,结构开销仅相差 13 个字(104 字节)(或者看起来,它仍然很模糊),所以ets:info/2 毕竟是相当准确的。

    插入一个由 2 个原子组成的简单元组后,erlang:memory/1 报告了 8 个字的内存分配增加,就像文档所说的那样(新 ETS 记录:6 个字 + 数据大小 - 在这种情况下为 2:每个原子 1 个字)。

    【讨论】:

      【解决方案2】:

      你可以阅读关于ets的文档。

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

      {内存,整数() >= 0 分配给表的字数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 2015-02-15
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        相关资源
        最近更新 更多