【问题标题】:I am trying to estimate memory requirements for my Dictionary(Of String, Long())我正在尝试估计我的 Dictionary(Of String, Long()) 的内存需求
【发布时间】:2017-09-21 13:24:00
【问题描述】:

我有一个带有 3,125,000 个唯一(字符串)键的 New Dictionary(Of String, Long())。 我在键之间分配了近 10 亿(935,984,413)个值(所有长整数),并为每个键填充一个 long() 数组。

这对于平均数据集来说工作得很好而且非常快,比如说要分发 1,5000,000 个字符串键和 500,000,000 个长值,这大约需要 2 小时。

但是,对于上述数据集,一旦我完成了一半的数据,该过程就会运行得非常缓慢,并且按照目前的趋势可能永远不会结束......

我认为我的内存不足,应用程序正在使用 5GB 内存,我认为它现在受到我的系统(8GB RAM)的限制。

如何计算上述情况所需的内存量? 字符串 Keys 的大小平均约为 5 个字符。

谢谢!

【问题讨论】:

    标签: vb.net dictionary bigdata


    【解决方案1】:

    Long 数据类型为每个 8 字节。对于string,情况更复杂。看看著名的 Jon Skeet 的 post

    引用:

    至少在当前的实现中,字符串占用 20+(n/2)*4 字节(向下舍入 n/2 的值)

    (注意:在他的blog post中,他对这个字符串计算有一些更新)

    鉴于您的情况,您的 5 个字符 string 中的每一个都会占用:

    20 + (5/2) * 4 = 20 + 8 = 28 bytes
    

    尽管如此,您可以通过仅计算有效数字来简化计算 - 在您的情况下是 Long,因为它的成员比 string 多得多,而您的 string 密钥尺寸较小(5 个字符)。

    因此,如果您有 10 亿个 Long,那么您将有大约 8GB 内存仅用于 Long。其他一些开销 + 字符串将不太重要,但至少需要将近 8 GB (935,984,413 x 8 = 7,487,875,304)。

    在您的示例中,string 将是:

    28 * 3,125,000 = 87.5 MB
    

    因此,stringLong() 总共需要 7.5~7.6 GB

    【讨论】:

    • 谢谢伊恩,我希望计算会这样(不知何故)简单。上一次运行 500,000,000 个 long 需要大约 4GB,这是正确的,据我所知,它的峰值约为 3.9GB。
    • @Yeahson 你的意思是上面的计算很简单?还是很复杂?
    • 不,很简单。我期待一个更复杂的方法,它不是这么简单。
    • @Yeahson 啊我明白了.. 这是因为这里的主要项目是 Long... ;) 例如,我们不计算 Dictionary 本身,因为它不那么重要...
    • 现在我需要找到一种方法来最小化内存占用。 10 亿大小的数据集甚至不是我计划做的最大值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2016-03-02
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2018-02-20
    • 2021-08-27
    相关资源
    最近更新 更多