2012-12-06 15 views
0

我有一個巨大的轉儲文件 - 12GB的文本包含數百萬條目。每個條目都有一個數字標識,一些文本和其他不相關的屬性。我想將這個文件轉換成能夠提供有效查找的東西。也就是說,給定一個id,它會很快返回文本。限制:用高效的查找替換一個巨大的轉儲文件Java鍵值文本存儲

  1. 嵌入在Java中,最好沒有外部服務器或外語依賴關係。
  2. 讀取和寫入磁盤,而不是內存 - 我沒有12GB的RAM。
  3. 不會爆炸太多 - 我不想將12GB文件轉換爲200GB的索引。我不需要全文搜索,排序或任何幻想 - 只需鍵值查找。
  4. 高效 - 這是很多數據,我只有一臺機器,所以速度是一個問題。可以存儲大批量和/或使用多個線程工作的工具是首選。
  5. 存儲多個字段很好,但不是必須的。主要關注的是文字。

你的建議是歡迎!

+0

您應該指定轉儲的格式。 – 2012-12-06 11:21:22

+0

格式是否重要?這聽起來像它需要被加載到一些商店,因此最初的格式是不相關的這個問題 –

+0

@BrianAgnew我想如果每條記錄一行,他可以創建一個手動索引'id => lineNumber' – 2012-12-06 11:31:03

回答

0

爲什麼不使用JavaDb - 隨附於Java的數據庫?

它會正確地存儲在磁盤上的信息,並在查找方面有效,只要你的索引。它將運行在JVM中,所以你不需要單獨的服務器/服務。您可以使用標準JDBC與之交談。

我懷疑它會非常高效。這個數據庫有很長的歷史(曾經是IBM的Derby),並且在穩健性和效率方面花費了大量的精力。

你顯然需要做什麼來創建數據庫中的數據的初始入職,但這是一次性的任務。

0

我會用Java Chronicle或類似的東西(部分原因是因爲我寫的),因爲它的目的是訪問大量數據(比你的機器大)一些什麼隨機。

它可以存儲任何數量的文本或二進制格式字段(或組合,如果你願意的話)它增加了每條記錄的8個字節,你希望能夠隨機訪問。它不支持刪除記錄(您可以將其標記爲重複使用),但您可以更新和添加新記錄。

它只能有一個寫線程,但它可以通過一個號碼在同一臺機器上的線程(甚至是不同的進程)

它不支持批處理,但它可以讀/寫百萬閱讀每秒條目與典型的亞微秒延遲(除了隨機讀取其不是在存儲器/寫入)

它使用旁邊沒有堆(< 1 MB,用於數據的TBS)

它使用一個id是順序,但你可以建立一個表來做這個翻譯。

BTW:你可以買32 GB不到$ 200。也許是它獲得更多內存的時間;)

+0

記載內存或緩存到磁盤? –

+0

它使用內存映射文件,因此可以直接使用Java訪問操作系統的磁盤緩存。這意味着讀取和寫入磁盤是由操作系統透明地完成的。即內存有多少,以及磁盤上的數據如何重要(實際上不可能從Java中知道),並取決於您擁有多少免費資源。順便說一句,它需要一個64位的JVM,因爲它使用虛擬內存。 –