2011-03-17 56 views
5

我正在一個項目中進行了大量的數據搜索,所以我正在實現使用傳統的數據庫結構不工作,因爲我需要將表格讀入HashMap格式,它保持在記憶整個時間,以便能夠在應用程序性能所需的時間內運行查詢。Java,推薦使用持久HashMap來保證永久可靠的存儲?

我想知道什麼建議HashMap的過程是關於從它們的持久狀態中檢索它們的速度,並考慮最小化額外的代碼需要(因爲現在我正在編寫自定義類,從數據庫表中讀取必要的數據然後創建一個嵌套的HashMap來反映我需要的數據結構,以便儘可能快地被搜索到。我不確定是否簡單地寫入文本文件將是一種適當的方式來做到這一點,以確保數據將被保留,並沒有損壞。任何建議表示讚賞

+1

這可能是相關的:http://stackoverflow.com/questions/3832622/java-large-persistent-hash-structure – 2011-03-17 11:58:51

回答

3

您使用鍵值數據庫(如Redis的或了Riak)考慮?

+0

我不熟悉那些,但我一定要檢查出來,謝謝你的提示 – Rick 2011-03-17 11:31:40

2

如果你堅持從您的數據庫的內容到一個哈希結構,以防止DB內容加速搜索我想你可能採取了錯誤的做法。我不知道你想要做什麼,但也許使用像Lucene這樣的索引是合適的?這是一個成熟且高度優化的索引,它將處理諸如在內存中緩存頻繁查詢等內容。

或者看看BerkeleyDB這基本上是一個磁盤備份哈希數據庫。也非常快。 (雖然我注意到,相信甲骨文現在可能需要一些許可證來支持這些用例)。

Lucene和BerkeleyDB唯一需要注意的是它們需要一些開銷來設置。所以我最後的建議是Tokyo-Cabinet這是一個相當不錯,非常快速,非常簡單的使用磁盤支持散列。基本上只包括在你的班級路徑中的jar,並使用它像一個HashMap:

import tokyocabinet.HDB; 

.... 

String dir = "/path/to/my/dir/"; 
HDB hash = new HDB(); 

// open the hash for read/write, create if does not exist on disk 
if (!hash.open(dir + "unigrams.tch", HDB.OWRITER | HDB.OCREAT)) { 
    throw new IOException("Unable to open " + dir + "unigrams.tch: " + hash.errmsg()); 
} 

// Add something to the hash 
hash.put("blah", "my string"); 

// Close it 
hash.close(); 

就是這樣。您在散列中的任何內容都會持久保存到磁盤,並且可以稍後重新加載。不要擔心速度,內幕優化會在幕後爲您處理。

編輯:它看起來像東京內閣已被Kyoto Cabinet取代。

編輯2:你不會說你正在使用什麼數據庫,但是如果MySQL確實full text search不適合你?

+0

在做了更多的研究之後,我認爲使用關係數據庫有一定的缺點,就我而言,與NoSQL數據庫相比(我剛剛熟悉這個概念)。我在搜索引擎的應用程序,所以我覺得從關係數據庫越來越遠的工作是必要的,反正,感謝您的信息,京都內閣是我現在用的肯定是考慮 – Rick 2011-03-19 07:50:35