2010-09-30 81 views
7

我正在尋找java中的一個持久哈希結構,這是一個簡單的鍵值存儲,其中鍵是一個唯一字符串,值是一個int。每次將現有密鑰添加到商店時,密鑰的值都會增加。Java:大型持久散列結構?

我需要這個非常大 - 可能是500米--10萬個按鍵。我一直在評估東京內閣http://fallabs.com/tokyocabinet/javadoc/,但不知道它會如何擴展 - 隨着哈希增長,插入時間似乎越來越長。

關於什麼可能適合的任何想法?

感謝

編輯:爲了減少磁盤I/O,我要在一個內存中的HashMap進行緩存數據,然後一氣呵成更新持續哈希當高速緩存增長到一定的大小。

編輯2:持久性的一個原因是我的內存有限,4GB,所以我不能適應內存的大結構。

+0

有趣的問題。 – 2010-09-30 16:27:36

+0

您遇到的問題將會受到您選擇的硬件限制。你應該設計你的軟件來解決這個限制,但是由於你的磁盤性能可能會比主內存慢1000倍,所以你只允許每個條目有4個字節。 – 2010-10-02 12:37:18

回答

5

我的東西Megamap是你在找什麼:http://megamap.sourceforge.net/。下面是從它的主頁Megamap的簡短說明:

MegaMap是一個Java實現一個 地圖(或散列表),其可以存儲數據的一個 無限量的,僅 通過的可用磁盤空間量的限制。 存儲在地圖中的對象是 持久存儲到磁盤。通過內存中緩存實現的性能良好是 。該MegaMap可以爲所有實際的 的原因,被認爲是作爲一個地圖 執行與無限存儲 空間。

+0

看起來有趣,我會檢查出來,謝謝 – 2010-10-06 08:23:27

+0

再次感謝您的建議 - 但看起來沒有維護 - 還沒有自2005年以來更新:( – 2010-10-07 14:37:07

+0

我會看看ehcache或其他terracota庫,可能其中之一可以幫助你。megamap是在ehcache的頂部開發的,所以它是一個很好的搜索方向。也許ehcache可以做到這一點開箱即用 – Skarab 2010-10-07 15:11:50

2

使用數據庫而不是散列。即使對於一個數據庫來說,500M行也變得非常大。您每秒會有多少更新?

+0

NoSQL db是否合適 - 例如MongoDB?這些本質上是一個關鍵價值商店嗎? – 2010-10-07 15:18:15

0

所以,如果我理解正確,Redis可能是一個選項。您可以發出INCR [鍵]命令以原子方式遞增與該鍵關聯的值。如果該鍵不存在,則將其設置爲零,然後遞增(導致一個)。根據docs,INCR是一個恆定時間操作。速度是Redis的主要設計目標。

Redis能夠堅持自己的文件,並且您可以控制參數如何發生。

+0

聽起來像Redis可能必須完全適應內存。從註釋中「爲了非常快速,但同時堅持將整個數據集存入內存中」。我受4GB RAM限制。 – 2010-09-30 16:54:22

+0

它具有虛擬內存功能,http://code.google.com/p/redis/wiki/VirtualMemoryUserGuide。它也不必在與JVM相同的主機上本地運行。當然,這取決於您的組織在您的生產環境中可以安裝多少自由度...... – romacafe 2010-09-30 17:18:55

+0

這裏有個警告:「警告:因爲密鑰不能被換出,所以Redis不會如果按鍵單獨使用的空間大於極限,則能夠遵守vm-max-memory設置。「我想這就是爲你排除Redis,除非你只是得到一個很大的盒子來運行它... – romacafe 2010-09-30 17:27:50

0

我認爲Memcached是適合您的情況以及後端合適的數據庫的不錯選擇。