簡體   English   中英

C#中字典的內存使用情況

[英]Memory usage of Dictionaries in C#

我有一些代碼,我添加了一個嵌套字典,格式如下

Dictionary<string, Dictionary<string, Dictionary<string, float>>>

這樣做后,我注意到我的應用程序的內存使用情況嚴重上升。 這些詞典以經常重復的字符串為基礎,並且有許多這些字典,大約有數十萬字典。

為了解決這個問題,我假設重復的字符串占用了大量的內存。 我的解決方案是散列字符串並使用整數(我會保留彩虹表的一個副本,以便我可以在必要時反轉哈希)

Dictionary<int, Dictionary<int, Dictionary<int, float>>>

所以我去了一個內存分析器,看看我能得到什么樣的尺寸減小。 令我震驚的是,我實際上發現字符串存儲的大小實際上更小(正常和包含)。

這對我來說沒有直觀意義。 即使編譯器足夠智能只存儲字符串的一個副本並使用引用,我認為引用將是一個指針,它的大小是int的兩倍。 我也沒有使用任何String.Intern方法,所以我不知道這將如何實現(這里也是String.Intern正確的方法?)

我對引擎蓋下發生的事情感到非常困惑,任何幫助都會受到贊賞

如果您的鍵和值是對象,則字典的每個元素的開銷大約為20字節,每個字典還有幾個字節。 這是鍵和值本身消耗的空間的補充。 如果你有值類型作為鍵和值,那么它是12個字節加上鍵所占用的空間和字典中每個項的值。 這是因為元素的數量等於內部字典容量。 但通常存在比元素更多的容量,因此浪費了空間。

浪費的空間通常是一個更高的相對百分比,如果你有很多字典與少量元素相比,如果你有一個字典有很多元素。 如果我按你的評論說,你的8個元素的詞典的容量為11,含2個元素的詞的容量為3,而10的元素的容量為11。

如果我理解你的嵌套計數,那么一個頂級字典將代表184個字典元素。 但是,如果我們計算未使用的容量,就空間消耗而言,它接近200。 每個頂級字典200 * 20 = 4000字節。 你有多少人? 你說成千上萬的物體中有成千上萬的它們。 每10,000個將消耗大約38 MB的字典開銷。 添加到字典中存儲的對象。

通過管理哈希碼來嘗試將其縮小的原因可能是一個原因,即如果沒有大量重復引用鍵。 使用int鍵替換對象引用鍵不會更改字典開銷量,而是添加新哈希代碼集的存儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM