.Net数组大小的局限性

时间:2010-03-10 08:34:06

标签: c# arrays

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

我不确定我的印象是否正确。有谁可以确认?

5 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:13)

这是正确的。 No single object can be larger than 2 GB

  

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

此问题有其他详细信息和一些有用的链接:Single objects still limited to 2 GB in size in CLR 4.0?

答案 2 :(得分:4)

您将首先遇到实际限制 - 分配2gb数组是不可能的。我遇到的实际限制是在程序开始时大约800mb标记 - 之后大幅下降。

任何大于64mb的东西都是32位的运气赌博 - 大型对象堆没有进行碎片整理,因此你需要65mb一块免费或分配失败。

理论限制是:

  • 可用内存,特别是32位以下。
  • 索引的32位数字空间(0向上 - 没有数组的负数,除非你在创建中玩智能)。您可以创建允许负数的数组,但不能使用C#标准语法 - 仅使用反射。
  • 每个对象2gb。

但严重的是,实际意义更大。

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

答案 3 :(得分:1)

我原以为限制可能在索引上。我认为使用的索引必须是一个整数,所以任何大于整数的东西都不会起作用,除非他们有一些方法。那将是4294967296元素。不确定这是否真的是半真的。我想知道答案。

编辑: 正如tomtom所指出的,整数通常是有符号的,除非它们使用非有符号整数。所以4294967296或2147483648的一半左右。

答案 4 :(得分:0)

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

  

即。

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