声明锯齿状数组成功,但在声明相同大小的多维数组

时间:2018-05-15 14:20:08

标签: 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];
}

我的第一个问题是为什么会发生这种情况?

作为后续问题,我的最终目标是对此数据运行主成分分析(PCA)。它是一个非常大的数据集。 &#34;行数&#34;在矩阵中可能是几百万。 &#34;列的数量&#34;我将在Accord.net框架中找到一个似乎很受欢迎的PCA库。它需要一个锯齿状的数组作为输入(我可以成功地创建和填充数据),但是当我将它传递给PCA时我的内存耗尽 - 我猜是因为它传递了值并创建了数据的副本(?) 。我的下一个想法是只写自己的方法来做PCA,所以我不必复制数据,但我还没有达到目的。我以前很难处理内存管理,所以我可以接受提示。

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

1 个答案:

答案 0 :(得分:1)

在32位中,连续的地址范围超过几百mb是很复杂的(参见例如https://stackoverflow.com/a/30035977/613130)。但很容易得到几百mb(甚至1gb)的分散存储器......

多维数组是连续内存的单个平板,锯齿状数组是小数组的集合(因此是小块内存)。

请注意,在64位中,创建.NET允许的最大大小的数组要容易得多(大约2gb甚至更多......请参阅https://stackoverflow.com/a/2338797/613130