2014-01-12 38 views
1

我正在尋找最快的方法,用Java存儲大約10億條記錄,每條記錄約250字節(存儲只會發生一次),然後能夠以非連續順序多次讀取它。Java:用於存儲和讀取10億條數據記錄的最佳方法

源記錄正在生成簡單的java值對象,我想以相同的格式讀回它們。

現在我最好的猜測是在平面文件中使用快速序列化庫(如Kryo)存儲這些對象,然後使用Java FileChannel直接隨機訪問以讀取文件中特定位置的記錄(當存儲數據時,我將保存在一個hashmap中(也可以保存在磁盤上),每個記錄的文件中的位置,以便我知道在哪裏讀取它)。

另外,不需要優化磁盤空間。我主要關心的是優化讀取性能,同時具有合理的寫入性能(即再次僅發生一次)。 最後精確度:雖然記錄都是相同類型(相同的Java值對象),但它們的大小(以字節爲單位)是可變的(例如它包含字符串)。

有沒有比我上面提到的更好的方法?任何暗示或建議將不勝感激!

非常感謝, 托馬斯

+1

你有沒有考慮將它們放入數據庫?這樣可以讓您以更低的編程成本進行更復雜的索引。 –

+0

對複雜索引沒有實際需求:我只需要知道在哪裏閱讀特定記錄(其在文件中的位置永遠不會改變)。我的猜測是使用數據庫將會慢得多(與數據庫通信的開銷較大等)。 – Tom

+0

我一直在考慮索引更多的性能,特別是在選擇內存中的內容時。 –

回答

1

您可以使用Apache Lucene的,很會照顧你上面:) 它是超級快提到的一切,你可以更快速地搜索結果,然後不斷。 Apache Lucene將文件中的對象保存並編入索引。我們已經在幾款應用中使用它,而且速度非常快。

+1

+1:這是Lucene的100%匹配。 –

+0

感謝您的建議。閱讀描述「Apache LuceneTM是一個高性能,全功能的文本搜索引擎庫,完全用Java編寫,它幾乎適用於任何需要全文搜索的應用程序,尤其是跨平臺的應用程序。」 =>它似乎與文本相關,而在我的情況下,我正在存儲非文本數據+我確切地知道我要閱讀哪個記錄(不需要複雜的搜索)。我錯過了什麼嗎?任何關於我應該在Apache Lucene中專門尋找的提示?謝謝! – Tom

+0

只需看看網站上提供的演示(http://lucene.apache.org/core/4_6_0/demo/overview-summary.html#overview_description) 其次,你還可以閱讀「Lucene in Action」第二版「 此外,您可以將非文本數據存儲在任何位置,但會將其索引(位置,索引,ID)Lucene以非常快的速度獲取它。 –

1

您可以使用嵌入式Derby數據庫。它是用Java編寫的,你可以在你的流程中實際運行它,所以沒有進程間或網絡通信的開銷。它將存儲數據並允許您查詢/ etc以處理所有複雜性和索引。

+0

謝謝,但嵌入式德比(或H2,甚至更快)需要約200毫秒的簡單隨機查詢。使用我的方法進行的早期測試顯示〜1ms爲簡單的隨機查詢=>現在我的方法似乎是最快的 – Tom

相關問題