创建大数组[,]时内存不足

时间:2019-01-12 21:55:07

标签: c#

例如,当我要创建大数组时,我的内存不足。

 var size = 20000;
 var matrix = new decimal?[size, size];

我已经设置了64位项目,然后取消选中“首选32位”。

Screen1

我在App.config中添加了

<runtime>
    <gcAllowVeryLargeObjects enabled="true"/>
</runtime>

Screen2

我有16 GB RAM。 我忘记了什么?

1 个答案:

答案 0 :(得分:7)

一个对象中的10Gb(24个字节(可为空的十进制大小)* 20000 * 20000)超过了.NET(即CLR)中单个对象的默认大小-有关如何超出该值的信息,请参见this MSDN documentation "gcAllowVeryLargeObjects Element"通过更改配置变量。该文章还列出了您可能感兴趣的数组的 other 限制,例如,数组中只能包含2 ^ 32个元素-以防400M元素不够用而您正在考虑将其提升到一个新的水平。

更好的解决方案是用C#标记为[][]的{​​{3}}-每行将是一个单独的对象(一维数组[]),因此您不会遇到任何问题这些限制。

您可能要考虑其他选项。例如,也许您的数组稀疏?也许它是一个具有可用属性(例如上三角)的矩阵?也许您可以重新考虑自己在做什么,所以您不需要10Gb的任何数组-而是选择另一个数据结构甚至更好,如果确实需要处理该数据量,则使用外部将数据存储在磁盘上并以可预测的方式(例如顺序或多顺序)访问数据的算法?

最后,我质疑为什么您需要一个庞大的 nullable 十进制数组:听起来您确实有一个 sparse 数组,应该考虑针对的解决方案稀疏数组(在StackOverflow和Google上很多)。