了解当你填充一个Hashtable时发生了什么很重要。 (辞典使用Hashtable作为其底层的数据结构。)
当创建一个新的哈希表,.NET使含有11个水桶,其被链接字典条目的列表的阵列。当您添加一个条目时,其密钥被散列,哈希代码被映射到11个桶中的一个,并且条目(键+值+散列代码)被附加到链接列表。
在某个点(这取决于首次构建Hashtable时使用的加载因子),Hashtable在Add操作期间确定它遇到太多冲突,并且最初的11个桶不是足够。因此它会创建一个新的桶阵列,其大小是原来的两倍(不完全是这样;桶的数量总是总数),然后从旧的表中填充新的表格。
所以有两件事情就内存利用率而言起作用。
首先,每隔一段时间,Hashtable需要使用两倍于当前使用的内存量,以便它可以在调整大小时复制表。所以,如果你有一个使用1.8GB内存的Hashtable,并且需要调整大小,那么需要使用3.6GB,现在你有问题了。
第二个是每个哈希表条目都有大约12个字节的开销:指向键值,列表中的下一个条目的指针,加上哈希码。对于大多数用途来说,这种开销是微不足道的,但如果你正在构建一个包含1亿个条目的Hashtable,那么这大约有1.2GB的开销。
您可以通过使用允许您提供初始容量的Dictionary构造函数的重载来克服第一个问题。如果您指定的容量足够容纳所有要添加的条目,则在填充Hashtable时不需要重建它。关于第二个,你几乎没有什么可以做的。
32位窗口上3.5GB。 – UnkwnTech 2008-12-05 14:57:09
我以为3。5GB是整个系统使用的物理内存量,但每个进程限制为3GB。无论哪种方式,它都小于5 :) – 2008-12-05 15:00:45
而您的应用程序需要设置为任何cpu或x64以利用64位系统。 – 2008-12-05 15:55:36