.Netarrays尺寸的限制

我听说.Net Array的大小有一个硬性限制。 据说可以分配给Array对象的任何一个单独的实例的内存的最大量(不pipe是int[]double[]还是你自己的数组)都是2GB。 不,如果你有一个64位的机器,2GB的限制仍然存在。

我不确定我的印象是否正确。 任何人都可以确认

那是对的。 没有一个对象可以大于2 GB 。

与32位Windows操作系统一样,在64位Windows操作系统上运行64位托pipe应用程序时,可以创build的对象大小有2GB的限制。

这个问题有额外的细节和一些有用的链接: 在CLR 4.0中,单个对象的大小仍然限制在2 GB?

在4.5之前的.NET版本中,最大对象大小为2GB。 从4.5开始,如果启用gcAllowVeryLargeObjects,则可以分配较大的对象。 请注意, string的限制不受影响,但“数组”也应该覆盖“列表”,因为列表是由数组支持的。

你将首先遇到一个实际的限制 – 要分配一个2GB的数组是不可能的。 我遇到的实际限制是在800Mb左右的标志AT PROGRAM START – 在那之后急剧下降。

大于64MB的任何事情都是32位的幸运赌博 – 大对象堆没有碎片整理,所以你需要一块65MB的空闲空间或分配失败。

理论极限是:

  • 可用内存,尤其是在32位以下。
  • 索引的32位数字空间(0向上 – 数组无负数,除非你在创build时聪明)。 您可以创build允许负数的数组,但不能使用C#标准语法 – 只能使用reflection。
  • 每个对象2GB。

但严重的是,实际影响更大。

对于.NET 4.0 ….考虑使用内存映射文件;)

我会认为这个限制可能在索引上。 我认为使用的索引必须是一个整数,所以任何大于整数的东西都不会工作,除非有一些解决办法。 所以这将是4294967296元素。 不知道这是否一半是真的。 我想自己知道答案。

编辑:正如tomtom指出,整数通常是有标志的,除非他们使用一个非有符号的整数。 所以一半4294967296或2147483648粗略。

希望这个帮助: http : //blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx

  1. 它使用int作为索引,最大值= 2,147,483,647(2GB)
  2. 它的devise。 2。