2010-11-03 19 views
0

使用Java,如何在文件中存儲大約十億個鍵值對,並且可以隨時動態更新和查詢這些值?在文件中保留十億個鍵值對

+0

我敢肯定你考慮過使用數據庫嗎? – EboMike 2010-11-03 01:24:35

+0

它會是什麼類型的文件?如果需要,你將如何打開它?任何10億記錄檔案將會開放嗎?可能在一週內?爲什麼不使用數據庫?反正好運好友。如果有什麼東西擋住你,嘗試和再來。 :) – zod 2010-11-03 01:26:48

+2

嘗試Redis http://code.google.com/p/redis/ – 2010-11-03 01:27:32

回答

1

如果由於某種原因,數據庫出了問題,那麼你就需要回答您的問題以下問題:

什麼是以下操作的組合?

  • 插入
  • 修改
  • 刪除
  • 搜索

一旦你有這些業務的比例很好的猜測,儘量選擇使用合適的數據結構在你的文件中。我建議先從這本書作爲一個選項良好的目錄:

http://www.amazon.com/Introduction-Algorithms-Second-Thomas-Cormen/dp/0262032937

你要選擇你最常用的操作與最佳的平均數據結構和最壞情況下的運行時間。

好運

+0

謝謝你的建議,我會考慮這個的 – rda3mon 2010-11-03 01:53:38

0

你可以使用數據庫嗎?管理這樣一個大文件將是一件痛苦的事情。

編輯:如果文件要求主要是爲了避免機器通信故障,停機時間和類似的情況,也許你可以使用嵌入式數據庫。這樣你就可以從大文件操作問題中解脫出來,並且仍然使用數據庫可以給你的所有優點。我已經使用Apache Derby作爲嵌入式數據庫,並獲得了精彩的結果。 Java DB是Oracle支持並基於Derby。

+0

這不是我的要求:(我幾乎不能改變任何東西 – rda3mon 2010-11-03 01:51:13

+0

編輯,額外的建議。 – mdrg 2010-11-03 02:29:13

0

您忽略了很多細節,但...

鍵是否是靜態的?什麼值呢?他們是否固定大小?爲什麼不使用數據庫?

如果您不想使用數據庫,請使用內存映射文件。

+0

鍵是靜態的,但在飛行中我必須改變值如果需要的話 – rda3mon 2010-11-03 01:52:09

1

老問題,但這是一個日誌文件的情況。每次刪除時,您都不想複製十億條記錄。這可以通過將所有「事務」或更新記錄到新的單獨文件來解決。這些文件應該分解成合理的大小。

要讀取元組,您需要從最新的日誌文件開始,直到找到您的密鑰,然後停止。要更新或插入,只需在最近的日誌文件中添加一條新記錄。刪除仍然是一個日誌條目。

批量合併過程需要定期運行,它將掃描每個日誌文件並寫出另一個主文件。當它被讀取時,每個NEW鍵都被寫入到新的主鍵中,並且重複(舊)鍵被跳過,直到完成。如果您遇到刪除記錄,請將其標記在單獨的刪除列表中,跳過該記錄並使用該鍵忽略後續記錄。

這聽起來很簡單,但請記住,您可能想要阻止/分塊您的文件,因爲您可能會反向掃描所述日誌文件,或者至少將最大大小寫入並反向寫入而不是讀取。

我已經用數十億行數據完成了這件事。你只是在重新發明順序訪問數據庫。

+0

這個問題沒有說明「一個文件」嗎?注意:如果它是'一個文件',問題出在其他地方 – CMR 2011-02-17 22:02:42

+0

@CMR,你的意思是引用他是在尋找一個SINGLE文件還是至少有一個文件系統文件表示形式?如果是這樣,那麼我們只有3個選項1)爲每個XA重寫1b條記錄,2)批量XAs用於連續變化但仍然重寫和3)登錄到數據文件。 – Xailor 2011-02-17 22:39:35

+0

這是我的猜測。你說Ringo重新發明輪子是非常正確的。其他人則建議使用輕量級數據庫,內存映射文件等, – CMR 2011-02-18 13:50:29

相關問題