C# 声明交错数组成功,但在声明相同大小的多维数组时内存不足

C# 声明交错数组成功,但在声明相同大小的多维数组时内存不足,c#,arrays,multidimensional-array,pca,jagged-arrays,C#,Arrays,Multidimensional Array,Pca,Jagged Arrays,我在运行这行代码时遇到内存不足异常: double[,] _DataMatrix = new double[_total_traces, _samples_per_trace]; 但此代码成功完成: double[][] _DataMatrix = new double[_total_traces][]; for (int i = 0; i < _total_traces; i++) { _DataMatrix[i] = new double[_samples_per_trace

我在运行这行代码时遇到内存不足异常:

double[,] _DataMatrix = new double[_total_traces, _samples_per_trace];
但此代码成功完成:

double[][] _DataMatrix = new double[_total_traces][];
for (int i = 0; i < _total_traces; i++)
{
    _DataMatrix[i] = new double[_samples_per_trace];
}
double[][][\u DataMatrix=新的双[\u总跟踪][];
对于(int i=0;i<\u总计\u道;i++)
{
_DataMatrix[i]=新的双[_个样本每_个跟踪];
}
我的第一个问题是为什么会这样

作为后续问题,我的最终目标是对这些数据进行主成分分析(PCA)。这是一个相当大的数据集。矩阵中的“行”数可能是几百万。“列”的数量将在50个左右。我在Accord.net框架中发现了一个PCA库,它似乎很受欢迎。它将一个锯齿状数组作为输入(我可以成功地创建并填充数据),但当我将其传递给PCA时,内存不足-我猜是因为它正在传递值并创建数据的副本(?)。我的下一个想法是写我自己的方法来做PCA,这样我就不必复制数据了,但我还没有做到这一点。我以前很少真正需要处理内存管理,所以我愿意接受一些技巧


编辑:这不是下面链接的主题的重复,因为该链接没有解释这两个主题的内存存储方式是如何不同的,以及为什么尽管它们的大小相同,但其中一个会导致内存问题。

在32位中,地址的连续范围超过几百mb是很复杂的(参见示例)。但很容易就有了总计约数百mb(甚至1gb)的分散内存

多维数组是一块连续内存,锯齿数组是一个小数组的集合(小内存块也是如此)


请注意,在64位中,创建.NET允许的最大大小的数组(大约2gb或更多…请参阅)

可能与Thank you(谢谢)重复的数组要容易得多!你的解释很有帮助。我将配置更改为x64,可以成功声明多维数组,而不会耗尽内存。也可能对ZanSullivan Wilson感兴趣。