【问题标题】:Extra large array超大阵列
【发布时间】:2015-12-15 20:40:02
【问题描述】:

我必须使用大小为 34000x34000 项的二维数组进行数学计算。

明显的问题 - CLR 不可能将如此大的数据部分存储在内存中。我尝试使用MemoryMappedFile,但在我尝试为对象创建查看器时它也失败了:MemoryMappedFile.CreateViewAccessor()。还有其他已经存在的存储大型数组的方法吗? (因为我没有太多时间尝试实现自定义大数据存储)

谢谢

【问题讨论】:

    标签: c# gcallowverylargeobjects large-data


    【解决方案1】:

    <gcAllowVeryLargeObjects> 配置元素允许 64 位进程使用超过 2 Gb 的阵列。你可以试试看。

    另外,看看sparse arrays能否帮到你:

    稀疏数组是其中大部分元素具有默认值(通常为 0 或 null)的数组。大数组中出现零值元素对计算和存储都是低效的。

    【讨论】:

    • 谢谢,这个解决方案最适合我
    【解决方案2】:

    如果您使用的是 .NET 4.5,则可以使用 <gcAllowVeryLargeObjects enabled="true|false"/>-config 元素。它配置 GC 以便它允许内存中大于 2GB 的对象。请参阅this,“我的应用程序适用于大型数据集(使用对象 > 2GB)”部分,分别为this

    【讨论】:

      【解决方案3】:

      作为gcAllowVeryLargeObjects 的替代方案,请考虑使用锯齿状数组 - 处理一大块内存(我猜双打大约需要 10GB)肯定需要一些额外的努力。

      YourType[][] array = Enumerable.Range(0, 34000).Select(_ => new YourType[34000]).ToArray();
      

      请注意,您肯定需要 x64 进程才能使用此类数组 - 确保仅使用 x64 显式构建您的 exe。

      【讨论】:

      • 我试过了,这段代码在 ~6000 元素上为我抛出了 OutOfMemoryException
      • @dotFive 我敢打赌你已经错过了“需要 x64 进程才能使用这样的数组”这句话。无论如何,gcAllowVeryLargeObjects 为您工作很好(我也看不出一个如何工作而另一个没有)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2011-05-01
      • 2014-08-28
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多