我试图确定List和Dictionary的最大大小(在RAM中)。我也很好奇每个元素/条目可容纳的最大数量,以及每个条目的内存占用量。
我的理由很简单:我和大多数程序员一样,有些懒惰(这是一种美德)。当我编写程序时,我喜欢编写一次程序,并尽可能地尝试将来证明它。我目前正在编写一个使用Lists的程序,但注意到迭代器需要一个整数。由于我的程序的功能仅受可用内存/编码样式的限制,我想编写它以便我可以使用带有Int64s的List或可能使用BigInts(作为迭代器)。我在这里看到IEnumerable是一种可能性,但是想知道我是否可以将Int64填入Dictionary对象作为键,而不是重写所有内容。如果可以的话,我想知道与重写它相比可能会花费多少成本。
我的希望是,如果我的程序证明有用,我只需要在5年内重新编译,以利用内存的增加。
答案 0 :(得分:6)
是否在课程文档中指定了?不,那么它没有说明。
就当前的实现而言,类本身的RAM中没有最大大小,如果你创建一个大小为2MB的值类型,将几千个推入一个列表,并接收一个内存不足异常,那就没什么了做List<T>
。
在内部,List<T>
的工作可以防止它拥有超过20亿件物品。使用Dictionary<TKey, TValue>
快速回答是很困难的,因为事物在其中定位的方式更复杂,但实际上,如果我正在考虑处理十亿个项目(例如,如果是32位值) ,然后是4GB),我希望将它们存储在数据库中并使用数据访问代码检索它们。
至少,一旦你处理的是一个4GB大小的数据结构,滚动你自己的自定义集合类不再算是重新发明轮子了。
答案 1 :(得分:3)
我使用并行字典在50万个游戏中排名3x3模式。显然有很多可能的模式。使用C#4.0,并发字典在大约1.2亿个对象中耗尽内存。它当时使用的是8GB(在一台32GB的机器上),但是我想想要增长得太多(tablegrowths发生在带有concurrentdictionary的大块中)。使用数据库会让我减慢至少百倍的速度。这个过程已经花了10个小时。
我的解决方案是使用多阶段解决方案,实际上进行多次传递,每个模式子集一次。像奇怪图案的一个通道和偶数图案的一个通道。当使用更多对象不再失败时,我可以减少通过量。
C#4.5通过使用无符号32位指针来增加对64位较大数组的支持 (提到的限制从20亿到40亿)。也可以看看 http://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx。不确定哪些对象将从中受益,List&lt;&gt;威力。
答案 2 :(得分:2)
我认为在解决具有Dictionary
密钥的int64
在5年或10年内是否有用之前,您需要解决更大的问题。
在内存(List
)中拥有Dictionary
或int32
个2e + 10个元素似乎不是一个好主意,不要介意9e + 18个元素({{1 }})。无论如何,框架永远不会允许你创建一个大小(甚至不接近)的怪物,也许永远不会。 (请记住,一个简单的int64
数组已经远远超过了框架对任何给定对象的内存分配限制。)
问题仍然存在:为什么你希望你的应用程序在内存中保存这么多项目的列表?如果您必须管理大量信息,则最好使用专用数据存储后端(数据库)。