数组中的内存不足异常

本文关键字:异常 内存不足 数组 | 更新日期: 2023-09-27 17:56:31

我想创建一个大小为 10^9 的元素数组,其中每个元素可以是相同大小的整数。我总是在初始化行得到一个OutOfMemoryException。我怎样才能做到这一点?

如果这是不可能的,请提出替代策略?

数组中的内存不足异常

在 .net 4.0 或更早版本中,数组限制为 2GB,即使在 64 位进程中也是如此。因此,对于十亿个元素,支持的最大元素大小为 2 个字节,但int为 4 个字节。所以这是行不通的。

如果你想有一个更大的集合,你需要自己编写它,由多个数组支持。

在 .net 4.5 中,可以避免此限制,有关详细信息,请参阅 Jon Skeet 的答案。

假设你的意思是int作为元素类型,如果你使用的是 64 位 CLR,则可以使用 .NET 4.5 执行此操作。

您需要使用<gcAllowVeryLargeObjects>配置设置。默认情况下,此功能不处于打开状态。

如果您使用的是较旧的 CLR 或使用的是 32 位计算机,那么您就不走运了。当然,如果您使用的是 64 位机器,但只是旧版本的 CLR,则可以将"一个大数组"封装到一个单独的对象中,该对象具有较小的数组列表......您甚至可以以这种方式实现IList<int>,这样大多数代码就不需要知道您实际上并没有使用单个数组。

(如注释中所述,您仍然只能创建一个包含 231 个元素的数组;但您对 109 个元素的要求完全在此范围内。

我认为您不应该将所有这些数据加载到内存中,将其存储在文件中的某个位置,并创建一个可以用作数组但实际上从文件中读取和写入数据的类

这是一般的想法(这当然行不通,而且你必须在编写它和其他一些东西之前将你的 int 值转换为 byte[] 数组)

public class FileArray
{
   Stream s;
   public this[int index]
   {
      get { s.Position = index * 4; return s.Read(); }
      set { s.Position = index * 4; s.Write(value); }
   }
}

这样,您将拥有像数组一样工作的东西,但数据将存储在硬盘驱动器上