首页 > 解决方案 > 声明锯齿状数组成功,但在声明相同大小的多维数组时内存不足

问题描述

运行这行代码时出现内存不足异常:

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)。这是一个相当大的数据集。矩阵中的“行”数可能是几百万。“列”的数量将在 50 左右。我在 Accord.net 框架中发现了一个似乎很流行的 PCA 库。它需要一个锯齿状数组作为输入(我可以成功地创建并填充数据),但是当我将它传递给 PCA 时内存不足 - 我猜是因为它是按值传递并创建数据的副本(?) . 我的下一个想法是编写自己的方法来执行 PCA,这样我就不必复制数据,但我还没有做到这一点。我之前并没有真正需要处理内存管理,所以我愿意接受提示。

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

标签: c#arraysmultidimensional-arraypcajagged-arrays

解决方案


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

多维数组是一块连续的内存,锯齿状数组是小数组(小块内存)的集合。

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


推荐阅读