我正在尝试在需要创建新列表之前计算列表的最大安全大小。我正在考虑根据类型使用数据结构的大小,然后除以 1 GB(因为 2 GB 是 < .Net 4.5 的限制),以查看我可以安全地将多少元素粘贴在列表中。也许 maxnumber - 3,以防开销和其他情况。
你的意见?
如果您的列表包含结构,则您的方法会起作用,但您需要考虑内存对齐(它可能导致超过 3 的错误......)。如果它是引用类型,则元素大小为 4(在 32 位 CLR 上)或 8(在 64 位 CLR 上)。
但是,如果这对您来说甚至是一个问题,您应该考虑使用替代方法。要么将整个列表存储在其他位置(数据库?)并将您需要的部分存储起来,要么使用不同的数据结构,例如列表列表(基本上将数据分段),在每个小列表中放置 100,000 个元素。
您应该能够获得由几乎 2Gb 的字节数组支持的项目列表(如果您尝试动态增长列表,由于重新分配策略,它显然会失败接近最大大小的一半)。
如果您的数据不是不可变的,则可以考虑采用更友好的 GC 方法,该方法不会在 LOH 上创建很多对象。尝试将所有分配设置为低于 LOH 分配的限制(我认为是 85Kb)并测量代码是否表现得更好。