数组中的Outofmemory异常

时间:2013-01-28 11:24:32

标签: c# arrays out-of-memory

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

如果无法做到这一点,请建议其他策略?

3 个答案:

答案 0 :(得分:6)

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

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

在.net 4.5中可以避免这种限制,详见Jon Skeet的答案。

答案 1 :(得分:5)

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

您需要使用<gcAllowVeryLargeObjects>配置设置。默认情况下

如果您使用的是较旧的CLR,或者您使用的是32位计算机,则表示运气不佳。当然,如果您使用的是64位计算机而只是旧版本的CLR,则可以将“一个大型阵列”封装到一个单独的对象中,该对象具有一个较小的阵列列表......您甚至可以实现{ {1}}这样,大多数代码都不需要知道你没有真正使用单个数组。

(如评论中所述,您仍然只能创建一个包含2个 31 元素的数组;但是您对10 9 的要求完全在此范围内。 )

答案 2 :(得分:0)

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

这是一般性的想法(这当然不会起作用,加上你必须在写入之前将你的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); }
   }
}

这样你就可以像数组一样工作,但数据会存储在你的硬盘上