【问题标题】:Out of memory when create big array [,]创建大数组 [,] 时内存不足
【发布时间】:2019-01-12 21:55:07
【问题描述】:

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

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

我已设置 64 位项目并取消选中“首选 32 位”。

Screen1

我在App.config中添加了

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

Screen2

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

【问题讨论】:

  • 您有多少可用内存?请注意,20.000 * 20.000 nullable Decimal 值的数组将需要大约 9.6GB 的可用连续内存供您的程序使用。
  • 请注意,Decimal 的字节大小为 16。因此,您尝试分配一个需要 16*20000*20000 字节(大约 6 GB)的数组。请注意,即使您有足够的可用 RAM,您也可能会遇到该异常。所需的 6 GB 需要在程序的进程地址空间中作为连续内存块使用;如果不是这种情况,则会发生相同的异常...
  • 我有 16 GB 内存
  • @elgonzo,你忘了计算Nullable 足迹

标签: c#


【解决方案1】:

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

更好的解决方案是a "jagged" array,在 C# 中标记为 [][] - 每行都是一个单独的对象(一维数组 []),因此您不会遇到任何这些限制。

您可能需要考虑其他选项。例如,也许你的数组是稀疏的?也许它是一个具有可用属性的矩阵,例如上三角?也许您可以重新考虑您正在做的事情,这样您就不需要任何 10Gb 数组 - 而不是更喜欢其他数据结构,或者甚至更好,如果确实需要处理大量数据,external将数据存储在磁盘上并以可预测(例如,顺序或多顺序)方式访问它的算法?

最后,我质疑为什么你需要一个巨大的 nullable 十进制数组:听起来你真的有一个 sparse 数组,应该寻找 的解决方案稀疏 数组(StackOverflow 和 Google 上有很多关于这些的内容)。

【讨论】:

  • 可为空的十进制的大小是 24 字节。
  • 我需要十进制的问题。但是对于测试我设置了 int?[20000,20000] 我仍然有同样的问题 - 内存不足
  • @Lucyper - int? 占用 8 个字节,因此这是一个仍然超过 2Gb 的 3Gb 数组。也许从一个较小的问题开始?另一种解决方案是使用二维“锯齿状”数组[][],其中每一行都是一个单独的对象。 (而不是单个对象。)在任何情况下它都可能是一个更好的解决方案。如果你坚持要走这条路,试试吧。
  • @davidbak 我为数组 [,] 创建了一个算法。数组 [] [] 可能是一个紧急解决方案,需要从我的站点进行大量代码更改。
  • @Lucyper,您或许可以创建一个具有 [int, int] 索引器 (docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…) 的类来替代您的 [ , ] 数组,这或许可以避免过多的代码更改。该类将在内部管理一组较小的数组(或建议的锯齿状数组),索引器实现管理对此类“隐藏”在单个数组中的元素的访问。
猜你喜欢
  • 2011-02-13
  • 2023-02-09
  • 1970-01-01
  • 2014-06-09
  • 2011-05-18
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
相关资源
最近更新 更多