2017-10-18 118 views
-1

我有一種情況,在我的服務器中有大量的hashmaps(數百萬和數百萬),其中95%的字面上只有一個鍵。如何避免將我的hashmaps增加到2個鍵直到我嘗試添加第二個鍵?

服務器內存不足;這可能與初始HashMap默認大小爲16的事實有關,因此對於每個HashMap對象,我都浪費了大量內存。

用一個新的數據結構重新設計服務器的缺點,該數據結構將數據靈活地存儲爲1個元素或整個hashmap(我寧願避免),我試圖首先通過更改初始大小以1:

Map<String, Type2> myMiniMap = new HashMap<>(1); 

但是,我擔心的是,由於在包含HashMap 0.75默認加載因子,這將立即得到提高到2的那一刻我的第一個鍵添加到地圖(因爲1*0.75 < 1,這是怎麼我理解Java中的哈希大小調整邏輯)

假設我上面的理解是正確的(默認情況下,Java一旦我將第一個鍵添加到散列,將創建一個2鍵的空間),有沒有辦法阻止這種情況發生,直到我真的嘗試插入第二個鍵

例如,我應該將loadFactor設置爲零還是一個?

+2

*爲什麼*你有所有這些地圖?這聽起來像數據結構確實需要解決。 – chrylis

+0

您需要設置容量= 2,或者您可以設置capacity = 1和loadFactor> 1.0。但是,這兩種選擇之間的差異並不會對你的內存消耗產生顯着影響 - 因爲大約5%的數據具有多於1個密鑰,所以比HashMap –

+0

@chrylis內部浪費的空間大得多。我不確定創建自定義類是否會導致更糟糕的內存使用,說實話,以及更難理解 - 所以我寧願從代碼可讀性的角度探索那些不那麼複雜的解決方案第一。然而,如果你認爲有一個解決這個問題的內存優化類,請讓我知道,我會問作爲一個單獨的問題,所以你可以張貼作爲回答/ – DVK

回答

1

如果他們真的只會成爲單身人士,爲什麼不使用Collections.singletonMap來創建他們?這個缺點是創建的地圖是不可變的。

或者,您可以創建自己的類實現Map,它將在類字段中存儲一個鍵和值,然後如果嘗試添加第二個鍵值,它將切換到使用HashMap作爲其默認支持商店。這將比完成困難更繁瑣。

+0

與默認大小爲1的簡單HashMap相比,這樣的類(切換到HashMap)的內存性能如何? – DVK

相關問題