【发布时间】: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