Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';s列表中的最大项目数<;T>;?_C#_Collections - Fatal编程技术网

C# 什么';s列表中的最大项目数<;T>;?

C# 什么';s列表中的最大项目数<;T>;?,c#,collections,C#,Collections,有人知道列表中的最大项数是多少吗 我如何增加这个尺寸?还是有一个集合可以容纳无限多个项目?(即,尽可能多地存储在内存中) 编辑: 在整数列表中,当Count=134217728时,我得到一个内存不足异常。获得3Gb内存,其中2.2个正在使用。声音正常仅受内存限制 编辑:或者不,2Gb是限制!这很有趣,列表将限制为阵列的最大值,即2GB(即使在x64中)。如果这还不够,则说明您使用了错误的数据存储类型。但是,通过将int传递给构造函数,您可以通过正确启动它来节省大量开销 重新编辑-使用134217

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

我如何增加这个尺寸?还是有一个集合可以容纳无限多个项目?(即,尽可能多地存储在内存中)

编辑:


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

仅受内存限制

编辑:或者不,2Gb是限制!这很有趣,

列表将限制为阵列的最大值,即2GB(即使在x64中)。如果这还不够,则说明您使用了错误的数据存储类型。但是,通过将
int
传递给构造函数,您可以通过正确启动它来节省大量开销

重新编辑-使用134217728 x Int32,即512MB。请记住,
List
使用倍增算法;如果您通过
Add
(不首先分配所有空间)点滴输入项目,它将尝试加倍到1GB(在您已经持有的512MB、应用程序的其余部分,当然还有CLR运行时和库的基础上)。我假设您使用的是x86,因此每个进程已经有2GB的限制,并且很可能在添加项时将“大对象堆”碎片化到了死亡状态

就我个人而言,是的,从这一点上开始记忆犹新似乎是正确的



编辑:在.NET 4.5中,如果启用了交换机,则允许大于2GB的阵列。限制为2^31项。这对于引用数组(x64中每个引用8个字节)或大型
struct
s数组可能很有用。

列表将动态增长,以容纳您想要包含的任意多个项,直到超出可用内存

来自MSDN文档:

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


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

列表限制是21亿个对象,或者是第一次命中的内存大小。

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


我真的想问,究竟为什么您需要这么多,可能有一种更明智的方法来管理数据。

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


那我的记忆一定快用完了?!?不只是内存限制,还有一个硬限制是由于底层的数组支持。@Tony-你提到(评论)你的内存一定很快就用完了。。。你到底看到了什么问题?@Marc,用问题编辑了我的帖子更新了答案你的更新只是好奇,为什么你需要这么大的列表?RAM完全不相关。计算机中的芯片数量几乎与虚拟地址空间的大小无关;这就是你要用完的东西。不,我指的是2GB内存,这是CLR强加的。对于引用类型,这意味着(在x64上)每个引用8个字节,所以再将其划分几次-上面提到的一个有趣的副作用是,从理论上讲,x86中的数组中可以有更多的引用。事实上,在x86上,您永远无法分配这么大的数组,也无法为任何有用(和不同)的对象分配空间。。。在任何一种情况下,这种大小的列表/数组都是完全错误的。我从未见过一个.NET进程分配的内存超过1.5Gb(至少在一个AppDomain中)。大多数.NET进程似乎在达到存储引用的数组大小限制之前就耗尽了本地地址空间中的内存。有关更多详细信息,请参阅此问题。顺便说一句,Mono CLR不允许分配大于2Gb的数组吗。我认为他们支持这一点,因此实际上实现了Array.LongLength属性。获得3Gb内存,其中2.2个正在使用。听起来正常吗?看起来你只是在列表中使用了半个千兆字节(那么多整数*4字节/int32)。你可能正在突破边界。你需要数到那么高吗?你可以在没有计数的情况下初始化列表。计数就这么高,但我可以用另一种方法解决这个问题。谢谢你的回答。它帮助了我!很乐意帮忙。您还可以通过使用字节列表或int16来减少内存占用,而不仅仅是“int”。当然,这取决于这些类型是否适合您的需要。不,这是不正确的。任何对象都不能大于2 GB,因此包含实际引用或值的数组将显著限制这一点。不完全是这样,它随存储的对象类型而异。。。例如,对于64位进程,
int
的列表限制仅为268435456。我认为C#和Java使用32位整数作为索引是一种糟糕的设计,因为我们多年来一直使用64位ARQUITE结构,很容易拥有超过2GB或4GB或RAM。好的,这种大小的列表是有争议的,但是作为缓冲区的数组、文件、大于2GB的流媒体是可以的。然而,您需要脱离标准库来处理一个非常基本的问题。