瞭解當你填充一個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