【问题标题】:Create huge dictionary创建巨大的字典
【发布时间】:2015-09-04 03:23:43
【问题描述】:

在寻求质数的过程中,我已经问过这个问题:Can't create huge arrays,这导致我根据数组字典创建自己的假数组类...:private Dictionary<int, Array> arrays = new Dictionary<int, Array>();

我可以知道使用下面的代码创建大量 bool 的假数组(如 10 000 000 000):

public class CustomArray
{
    private Dictionary<int, Array> arrays = new Dictionary<int, Array>();

    public CustomArray(ulong lenght)
    {
        int i = 0;
        while (lenght > 0x7FFFFFC7)
        {
            lenght -= 0x7FFFFFC7;
            arrays[i] = new bool[0x7FFFFFC7];
            i++;
        }
        arrays[i] = new bool[lenght];
    }
}

但只要我要求 100 000 000 000 元素的 CustomArray,它就会崩溃。它适用于 25 次第一次迭代(我的 Dictionary 包含 25 个 0x7FFFFFC7 元素的数组),但随后它会因OutOfMemory 异常而崩溃。

作为余数,我有 16GB 内存,VS2013,程序以 64 位编译,我启用了 gcAllowVeryLargeObjects 选项,我在任务管理器中看不到任何内存峰值。


我怎样才能避免这个错误?

【问题讨论】:

  • 为什么字典是万能的?交错的数组不是更合适吗?
  • @Luaan 随机选择,我有心情查字典...
  • bool 也不是存储信息的有效类型。您可以简单地将 64 个布尔值存储在 ulong(8 个字节)中,而不是 64 个布尔数组(64 个字节)
  • 好吧,你没有有足够的内存供100 000 000 000bools 使用,甚至到目前为止都没有。每个bool 占用一个字节,因此您的 16 GiB 将仅包含 160 亿个项目。您看不到尖峰,因为不一定会分配 物理 内存(它全为零,所以它被映射到零页),但这只是一个隐藏的优化。 C# bool 不是一个位。 25 个 0x7FFFFFC7 元素数组占用 50 GiB
  • @Luaan sizeof(bool) 返回 1

标签: c# arrays dictionary


【解决方案1】:

100000000000 个布尔值表示约 93 GB 的内存。您只有 @50 GB(包括默认分配的虚拟内存)。

将它们存储为位(而不是字节),将使您减少到 ~12GB。

System.Collection.BitArray

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 2012-02-23
    • 2014-03-02
    • 1970-01-01
    • 2016-07-27
    • 2018-12-13
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多