2010-03-05 114 views
8

我目前正在研究一個編程相關的問題,我試圖製作一個海量的hashmap數據。數據的關鍵是實現hashCode()和equals(...)的CharSequence的自定義低內存實現,並且該值是Integer對象。推薦用於Java的低內存hashmap

在這個散列表中可能有成百上千的條目,我設法通過讓Integer成爲我希望散列的數據的文件中的指針,從而大大減少了對該值的內存使用量,但問題在於該關鍵字可能是幾十個字節(平均25個字節),並且密鑰需要在HashMap的默認實現中保存在內存中。

我需要一個具有低內存開銷的散列映射,並且可以將密鑰分頁到磁盤或者存儲密鑰的散列表示。如果密鑰本身被散列,那麼我會擔心散列衝突。

理想情況下,我希望能夠在每50MB堆空間(key中25個字節的一個字節數組和值部分中的Integer對象的一個​​字節數組)中存儲一百萬個條目。

有沒有人有低內存文件系統支持的地圖經過優化,以減少密鑰的足跡的經驗?

感謝,

克里斯

+0

空間和時間往往處於折中關係。添加,搜索,刪除節點的性能/可擴展性要求是什麼?如果你只是想要低內存,你可以使用一個數組。 – 2010-03-05 06:34:05

+1

像你想要的是一種內存數據庫? – 2010-03-05 07:06:05

回答

3

您可以使用Java的哈希映射並編寫一個採用RandomAccessFile,偏移量和長度的FileKey類,在構造時預先計算哈希,並通過從文件中讀取數據來實現比較,從而實現Comparable。

結合一個簡單的MRU緩存,您可以使用另一個鍵值在相同鍵上的哈希映射保留一些內存鍵,但是它使用自定義比較器來比較偏移量和長度值(而不是文件數據)。

1

我認爲默認HashSet不是一個壞的方法 - 自己製作鍵值對(所以你不必將它們包裝在一個額外的對象中)。這種方式非常具有記憶效率;它實際上只需要大約(1/loadFactor)^(3/2)* 4個字節的關鍵對象頂部的內存+ 4個字節的值。實際上,這應該爲每個條目增加8字節的開銷。 (如果事先知道要存儲多少個密鑰,則可以進一步降低此值。)