2012-03-29 64 views
2

在我的Java代碼,我使用番石榴的Multimap之(com.google.common.collect.Multimap)通過使用這樣的:問題與哈希映射空間

Multimap<Integer, Integer> Index = HashMultimap.create() 

這裏,Multimap之關鍵是URL和值的某些部分是URL的另一部分(轉換爲整數)。現在,我分配我的JVM 2560 Mb(2.5 GB)堆空間(使用Xmx和Xms)。但是,它只能存儲9百萬個這樣的(鍵,值)整數對(約1000萬)。現在,問題是,我可以提供JVM只有有限的內存量(比如2 GB)。

因此,任何人可以幫助我,

1)有另一種方式或自制的解決方案來解決這個內存問題?意思是,基於磁盤/數據庫的多地圖可以是一個很好的解決方案?我從一些網絡文章中讀到,有一些基於DB/Disk的解決方案可以解決這個問題。 Berkley DBEhcache。任何人都可以通知我(或哪一個)更快?

2)那些基於磁盤/數據庫的多圖有性能問題(我要求存儲和搜索)?

3)任何想法或信息如何使用這些簡短。

4)其他任何想法對我都很好。

注意:我希望Multimap(鍵可以有多個值)解決方案,以解決上述問題。而且我還必須考慮存儲和搜索的性能。

+0

請問你爲什麼要這樣做?對於很多項目,您可以使用簡單的關係數據庫,並在鍵列上配置索引。 – Groo 2012-03-29 18:54:58

+0

@格羅,我有超過1億個關鍵值對。我想要一個很好的快速存儲和搜索方式。 – Arpssss 2012-03-29 18:57:28

+0

僅供參考,我建議您的原始問題的答案可能會讓您繼續使用番石榴的'Multimap',同時減少空間開銷。 – 2012-03-29 19:33:27

回答

1

您當然不會在2.5 GB內存中存儲1億對Integer對象。如果我沒有弄錯,Integer將在Oracle/Sun JVM中使用至少16個字節的內存(並且對齊也是16個字節),這意味着只有3.2GB的內存用於Integer,沒有任何結構。

有了這個數據大小,你應該使用磁盤支持的東西,或者使用具有大量內存和/或優化數據結構的服務器(特別是試圖避免原始類型的包裝)。我已經使用H2進行類似的任務,並發現它非常好(它可以使用映射文件來訪問磁盤而不是讀取),但我沒有與其他類似庫進行比較。

+0

謝謝。但是,它可以用來存儲具有多個值的單個鍵嗎?你能否通過提供簡單的代碼來闡述你的答案,以便如何使用它?從你的經驗來看,速度更快嗎? – Arpssss 2012-03-29 20:09:48

+0

API是通過JDBC(如果每秒需要大量事務處理,則還有其他更快的API)。所以,基本上,你的代碼就像一個SQL數據庫,這意味着多個值需要由關係和多個表格表示,或者以某種方式編碼爲單個值(通常不那麼優雅)。至於速度,我沒有把它與競爭對比,其他因素至關重要。它肯定比內存映射慢得多。您可以尋找專門的結構或嘗試推出自己的,基於例如在Trove上(非常好,但規則的地圖,沒有multimap)。 – 2012-03-29 20:22:58

+0

對於每個Integer 16個字節的小增加,正如上面正確地解釋的:考慮到您所談論的數據量,您最終可能會得到一個64位虛擬機。而一個整數實際上會使用24個字節。原因是Object頭已經需要2個字(2 x 64位),然後是int(32位),但是考慮到如何增加內存和對齊對象,最終會得到24個字節...目標對齊距離爲8位正如我在HotSpot上所瞭解的那樣。 (在JRockit 64位上有16個64位壓縮文件?)。無論如何,3到4.5 GB之間的任何內容,對於2億個整數,沒有任何結構來包含它們! – 2012-04-03 15:52:38

2

JDBM3是一個非常快速的磁盤HashMap/TreeMap(B +樹)庫,聲稱比berkeley db快4倍。數十億條記錄可以存儲在地圖中。它在內部進行緩存,因此映射操作不會因爲磁盤訪問而變慢。

DB db = DBMaker.openFile(fileName).make(); 
Map<Integer,Integer> map = db.createHashMap("mapName"); 
map.put(5, 10); 
db.close() 

它不具有多重映射,但該值可以是一組/列表。

+0

謝謝。它比京都內閣快嗎?對於大型數據庫(比如數十億)是否好? – Arpssss 2012-03-31 00:01:09

+0

另一點是:是否有任何其他結構(如B樹或類似R樹)允許重複表示具有多個值的鍵? – Arpssss 2012-03-31 00:03:04

+0

它具有B +樹結構,多個密鑰存儲在單個樹節點上,並支持數十億條記錄。該網站說這比東京內閣慢,但它可能是最快的純粹哈瓦解決方案 – Andrejs 2012-03-31 08:26:45