列表与字典(最大大小,元素数)

我试图确定列表和字典的最大大小(在RAM中)。 我也很好奇每个元素/条目可容纳的最大数量,以及每个条目的内存占用量。

我的理由很简单:我和大多数程序员一样,有些懒惰(这是一种美德)。 当我编写程序时,我喜欢编写一次程序,并尝试尽可能地进行未来validation。 我目前正在编写一个使用Lists的程序,但注意到迭代器需要一个整数。 由于我的程序的function仅受可用内存/编码样式的限制,我想编写它以便我可以使用带有Int64s的List或可能使用BigInts(作为迭代器)。 我在这里看到IEnumerable是一种可能性,但是想知道我是否可以将Int64填入Dictionary对象作为键,而不是重写所有内容。 如果可以的话,我想知道与重写它相比可能会花费多少。

我的希望是,如果我的程序certificate有用,我只需要在5年内重新编译,以利用内存的增加。

是否在课程文档中指定了? 不,那么它没有说明。

就当前的实现而言,类本身的RAM中没有最大大小,如果你创建一个大小为2MB的值类型,将几千个推入一个列表,并接收一个内存不足exception,这与List无关List

在内部, List的工作方式可以防止它拥有超过20亿件物品。 使用Dictionary来快速回答是很困难的,因为事物在其中定位的方式更复杂,但实际上,如果我正在考虑处理十亿个项目(如果是32位值,则为例如,然后是4GB),我希望将它们存储在数据库中并使用数据访问代码检索它们。

至少,一旦你处理的是一个4GB大小的数据结构,滚动你自己的自定义集合类不再算是重新发明轮子了。

我使用并发字典在50万个游戏中排名3×3模式。 显然有很多可能的模式。 使用C#4.0,并发字典在大约1.2亿个对象中耗尽内存。 它当时使用的是8GB(在一台32GB的机器上)但是我希望增长得太多(tablegrowths发生在带有concurrentdictionary的大块)。 使用数据库会让我减慢至少百倍的速度。 这个过程已经花了10个小时。

我的解决方案是使用多阶段解决方案,实际上进行多次传递,每个模式子集一次。 像奇怪图案的一个通道和偶数图案的一个通道。 当使用更多对象不再失败时,我可以减少通过量。

C#4.5通过对arrays使用无符号32位指针增加了对64位较大arrays的支持(上述限制从20亿到40亿)。 另请参见http://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx 。 不确定哪些对象会从中受益,List <>可能。

我认为你有更大的问题要解决,甚至想知道带有int64键的Dictionary在5年或10年内是否有用。

在内存中有一个2e + 10个元素的ListDictionaryint32 )似乎不是一个好主意,不要介意9e + 18个元素( int64 )。 无论如何,框架永远不会允许你创建一个大小(甚至不接近)的怪物,也许永远不会。 (请记住,一个简单的int[int.MaxValue]数组已经远远超过了框架对任何给定对象的内存分配限制)。

问题仍然存在:为什么你希望你的应用程序在内存中保存这么多项目的列表? 如果必须管理大量信息,则最好使用专用数据存储后端(数据库)。