声明交错数组会成功,但在声明相同大小的多迪门数组时内存不足



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

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,这样我就不必复制数据,但我还没有那么远。 我以前真的不必处理内存管理,所以我愿意接受提示。

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

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

多维数组是连续内存的单个板,交错数组是小数组(因此是小块内存(的集合。

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

最新更新