1

我正在尝试为数据挖掘算法初始化一个 120 000 x 4600 的锯齿状数组,但我有一个 OutOfMemoryException例外

double[][] array = new double[120000][];
for (int i = 0; i < array.Length; i++)
{
    array[i] = new double[4600];
}

i它在大约 49 000时抛出

我知道 .Net 每个对象限制为 2GB,但我认为这里的数组将是双精度数组的地址列表。所以它不会是一个大的单一物体。

我认为这就是为什么 Jon Skeet 在声明大数组时为这个问题 OutOfMemoryException建议使用锯齿状数组

我不认为我理解他的回答。

它是一个大对象吗?如果不是,为什么它会抛出异常。

谢谢

4

1 回答 1

2

如果它是 32 位应用程序,您正确地得到OutOfMemoryException. 对于这个大小要求,您需要以 X64 为目标。

在 i = 49000 时,总内存 = 49000*4600*8 = 1803200000 字节 = ~1.68GB。

现在对于 32 位应用程序(针对 X86),应用程序可用的总用户内存为 2GB(除非应用程序是大地址感知的,.NET 应用程序 - 大地址感知和操作系统也为此启用。例如:(用于)Vista . 然后有一些 CLR 开销,然后是应用程序开销。

在 i = 120000 时,您需要总内存为总内存 = 120000*4600*8 = 1803200000 字节 = ~4.11GB。(平台目标应为 X64)

于 2013-11-04T16:38:16.953 回答