例如,当我要创建大数组时,我的内存不足。
var size = 20000;
var matrix = new decimal?[size, size];
我已经设置了64位项目,然后取消选中“首选32位”。
我在App.config中添加了
<runtime>
<gcAllowVeryLargeObjects enabled="true"/>
</runtime>
我有16 GB RAM。 我忘记了什么?
答案 0 :(得分:7)
一个对象中的10Gb(24个字节(可为空的十进制大小)* 20000 * 20000)超过了.NET(即CLR)中单个对象的默认大小-有关如何超出该值的信息,请参见this MSDN documentation "gcAllowVeryLargeObjects Element"通过更改配置变量。该文章还列出了您可能感兴趣的数组的 other 限制,例如,数组中只能包含2 ^ 32个元素-以防400M元素不够用而您正在考虑将其提升到一个新的水平。
更好的解决方案是用C#标记为[][]
的{{3}}-每行将是一个单独的对象(一维数组[]
),因此您不会遇到任何问题这些限制。
您可能要考虑其他选项。例如,也许您的数组稀疏?也许它是一个具有可用属性(例如上三角)的矩阵?也许您可以重新考虑自己在做什么,所以您不需要10Gb的任何数组-而是选择另一个数据结构甚至更好,如果确实需要处理该数据量,则使用外部将数据存储在磁盘上并以可预测的方式(例如顺序或多顺序)访问数据的算法?
最后,我质疑为什么您需要一个庞大的 nullable 十进制数组:听起来您确实有一个 sparse 数组,应该考虑针对的解决方案稀疏数组(在StackOverflow和Google上很多)。