List <t>中的最大项目是什么?</t>

时间:2010-01-05 21:29:21

标签: c# collections

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

如何增加这个尺寸?或者是否有一个收集无限物品的集合? (尽可能多地适合记忆)

编辑:

当一个int列表中的Count = 134217728时,我得到一个内存不足异常。获得了3G的RAM,其中2.2正在使用中。声音正常

6 个答案:

答案 0 :(得分:57)

List<T>将限制为数组的最大值,即2GB(即使在x64中)。如果这还不够,那么您使用的是错误类型的数据存储。但是,通过将int传递给构造函数,可以通过启动正确的大小来节省大量开销。

重新编辑 - 使用134217728 x Int32,即512MB。请记住,List<T>使用加倍算法;如果你是通过Add滴水喂食物品(不先分配所有空间),它会尝试加倍到1GB(在你已经拥有的512MB之上,你的应用程序的其余部分,当然还有CLR运行时和库)。我假设您使用的是x86,因此每个进程已经有2GB限制 ,很可能您已将“大对象堆”碎片化为 death 在添加项目时。

就个人而言,是的,在这一点上开始获得记忆的权利听起来是正确的。


编辑:在.NET 4.5中,如果启用<gcAllowVeryLargeObjects>开关,则允许大于2GB的阵列。那么限制是2 ^ 31项。这可能对引用数组(x64中每个8字节)或大struct s数组有用。

答案 1 :(得分:1)

仅限于记忆。

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

答案 2 :(得分:1)

在x64机器上,使用.Net Framework 4(非客户端配置文件),在Release模式下为任何CPU编译,我可以咀嚼所有可用内存。我的进程现在是5.3GB,我在PC上消耗了所有可用内存(8GB)。它实际上是Server 2008 R2 x64 我使用基于CollectionBase的自定义Collection类来存储以下类的61,910,847个实例:

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;
    }
}

答案 3 :(得分:0)

列表将动态增长以容纳您想要包含的任意数量的项目 - 直到您超出可用内存!

来自MSDN文档:

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

如果Count小于Capacity,则此方法为O(1)操作。如果需要增加容量以容纳新元素,则此方法将成为O(n)操作,其中n为Count。

答案 4 :(得分:0)

列表限制是21亿个对象或者你的记忆大小首先被击中。

答案 5 :(得分:0)

接口将Count和IndexOf等定义为int类型,因此我假设int.MaxValue或2,147,483,647是您可以粘贴在列表中的最多项目。

真的有问题为什么你需要这么多,有可能有更明智的方法来管理数据。