代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

列表中的最大项目数是多少?

  •  31
  • Tony The Lion  · 技术社区  · 15 年前

    有人知道列表中最大项目数是多少吗?

    我该怎么增加这个尺寸?或者有一个集合接受无限个项?(也就是说,尽可能多地融入到记忆中)

    编辑:

    当count=134217728出现在整数列表中时,我会得到一个内存不足异常。获得3GB内存,其中2.2在使用中。正常声音

    6 回复  |  直到 12 年前
        1
  •  56
  •   Marc Gravell    12 年前

    List<T> 将被限制为数组的最大值,即2GB(甚至在x64中)。如果这还不够,说明您使用的数据存储类型不正确。但是,通过传递 int 给建设者。

    重新编辑-使用134217728 x Int32,即512MB。记住 列表<t> 使用加倍算法;如果您通过 Add (不首先分配所有空间)它将尝试加倍到1GB(在您已经拥有的512MB之上, 应用程序的其余部分 当然还有clr运行时和库)。我假设你使用的是x86,所以你已经有2GB的限制了 每进程 ,并且很可能您已经将“大型对象堆”拆分为 死亡 添加项时。

    就个人而言,是的,在这一点上开始记忆不足似乎是正确的。


    编辑:在.NET 4.5中,如果 <gcAllowVeryLargeObjects> 开关已启用。然后限制为2^31项。这可能对引用数组(X64中每个8个字节)或大型数组很有用 struct S.

        2
  •  1
  •   Paul Creasey    15 年前

    它只受记忆的限制。

    编辑:或者不,2GB是限制!这很有趣, BigArray, getting around the 2GB array size limit

        3
  •  1
  •   Achilles    13 年前

    在一台X64机器上,使用.NET Framework 4(而不是客户机配置文件),在发布模式下为任何CPU编译,我可以将所有可用的内存咀嚼掉。我的进程现在是5.3GB,我已经消耗了我电脑上的所有可用内存(8GB)。它实际上是一个服务器2008 R2 x64。
    我使用的自定义集合类基于 CollectionBase 要存储以下类的61910847个实例:

    public class AbbreviatedForDrawRecord {
        public int DrawId { get; set; }
        public long Member_Id { get; set; }
        public string FactorySerial { get; set; }
    
        public AbbreviatedForDrawRecord() {
    
        }
    
        public AbbreviatedForDrawRecord(int drawId, long memberId, string factorySerial) {
            this.DrawId = drawId;
            this.Member_Id = memberId;
            this.FactorySerial = factorySerial;
        }
    }
    
        4
  •  0
  •   Sapph    15 年前

    列表将自动增长,以容纳您想要包含的所有项目-直到您超过可用内存!

    来自msdn文档:

    如果count已经等于capacity,则通过自动重新分配内部数组来增加列表的容量,并在添加新元素之前将现有元素复制到新数组。

    如果count小于capacity,则此方法是O(1)操作。如果需要增加容量以适应新元素,则此方法将变为O(N)操作,其中N是计数。

        5
  •  0
  •   Blounty    15 年前

    列表限制是21亿个对象或者你的内存大小,这是最早被点击的对象。

        6
  •  0
  •   Paolo    15 年前

    接口将count和indexof等定义为int类型,因此我假设int.maxvalue或2147483647是您可以在列表中保留的最多的项。

    真的有必要问一个问题,为什么在地球上你需要这么多数据,有可能有一个更明智的方法来管理数据。