c# - 声明锯齿状数组成功,但在声明相同大小的多维数组时内存不足
问题描述
运行这行代码时出现内存不足异常:
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)
推荐阅读
- javascript - FlotChart - 如何为折线图中的特定系列分配颜色?
- excel - 如何使用powershell更改excel CSV保存中的分隔符
- c# - Zebra 扫描仪 8178 onBarcode 读取事件未触发
- angular - 路由激活的任何保护激活
- python - Tensorflow:将导入的图形操作应用于 2d 张量的每个元素
- c# - 我创建的库使用不同版本的依赖项作为我的 MVC 项目
- apache-spark - Filtering Spark Dataset[Row] switch casing Column value
- c# - 当前上下文中不存在名称 Invoicee1
- python - 是否可以使用 pytest 进行 RESTful API 功能测试/一个好习惯?
- javascript - 用javascript中的'message'替换所有出现的$ {sentence}