2012-01-23 34 views
1

我有一個哈希表(多到一個文本和布爾值之間的關係):堅持HashMap的最有效方法是什麼?

name   flag 
--------------------- 
"abc"  TRUE 
"cde 12"  TRUE 
"foo"  FALSE 
"some text" TRUE 
etc... 

我需要堅持在Java應用程序中這種結構。這種結構將被延伸,但從未改變。這意味着我將添加新記錄,但不會刪除或更改現有記錄。什麼是非常重要的是搜索的速度(我提供了一個name,它返回flag)。它可能真的很大(數百萬條記錄)。我認爲有多種選擇:1)具有一個表和一個索引的關係數據庫,2)平面文件,3)純JVM數據庫。您會提出什麼建議?

回答

5

我建議JDBM3庫提供支持的HashMap和TreeMap實現的磁盤。它的快速,可擴展和易於使用。 Apache 2許可證。

從網站:

JDBM has outstanding performance; it can insert a million records per second and read them even faster

+0

我認爲這是對我最好的選擇,但他們還沒有在Maven的中央:https://github.com/jankotek/JDBM3/issues/31 – yegor256

1

鑑於記錄的數量,我會用名字上的關係數據庫去。

但是,如果找不到名字,這意味着什麼?

如果找不到相當於你的一個布爾值(如TRUE),那麼你有一個白名單(或黑名單取決於上下文),在這種情況下,我傾向於從數據庫中刪除標誌列並緩存名稱在一個哈希集。

如果找不到是一個單獨的值,那麼如果您有足夠的可用內存,您可以嘗試將整個表緩存在哈希映射中。

0

有多少百萬?我們有一個5mil記錄的例子,我們在內存中使用二進制搜索來獲取快速結果,它是帶有結果數據和latitiudes數據的geoloc數據,如果你有很多地址,那麼數據庫搜索會花費很長時間去查查看。 如果你有很多內存使用內存數組,如果不是的話 - 使用一個小的數據庫,不管是sqlite還是mysql。 sqlite也可以處理大量的數據,如果沒有多少線程客戶端會更新你的結構,不需要額外的服務器。 約源碼的限制 - Can SQLite handle 90 million records?

相關問題