有人知道列表中的最大项目数是多少?
如何增加这个尺寸?或者是否有一个收集无限物品的集合? (尽可能多地适合记忆)
编辑:
当一个int列表中的Count = 134217728时,我得到一个内存不足异常。获得了3G的RAM,其中2.2正在使用中。声音正常
答案 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是您可以粘贴在列表中的最多项目。
真的有问题为什么你需要这么多,有可能有更明智的方法来管理数据。