锯齿状数组OutOfMemoryException

时间:2013-11-04 16:27:46

标签: c# out-of-memory jagged-arrays

我正在尝试为数据挖掘算法初始化一个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,但我认为这里的数组是一个double数组的地址列表。所以它不会是一个大的单一对象。

我认为这就是为什么Jon Skeet为这个问题建议了一个锯齿状的阵列 OutOfMemoryException on declaration of Large Array

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

如果是32位应用程序,您正好得到OutOfMemoryException。对于此大小要求,您需要以X64为目标。

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

现在对于32位应用程序(针对X86),应用程序的总用户内存为2GB(除非应用程序为Large address aware.NET application - Large Address Aware并且还为此启用了操作系统。{{3然后有一些CLR开销,然后是应用程序开销。

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