超大数组

本文关键字:数组 | 更新日期: 2023-09-27 18:13:26

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

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

由于

超大数组

<gcAllowVeryLargeObjects>配置元素允许超过2gb的64位进程数组。你可以试一试。

另外,看看稀疏数组是否可以帮助您:

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

如果你使用的是。net 4.5,你可以使用<gcAllowVeryLargeObjects enabled="true|false"/> -config元素。它配置GC,以便允许大于2GB的对象占用内存。参见"我的应用程序适用于大数据集(使用对象> 2GB)"一节,分别为

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

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

请注意,您肯定需要x64进程使用这样的数组-确保明确地构建您的exe仅使用x64。