使用Java,如何在文件中存儲大約十億個鍵值對,並且可以隨時動態更新和查詢這些值?在文件中保留十億個鍵值對
回答
如果由於某種原因,數據庫出了問題,那麼你就需要回答您的問題以下問題:
什麼是以下操作的組合?
- 插入
- 讀
- 修改
- 刪除
- 搜索
一旦你有這些業務的比例很好的猜測,儘量選擇使用合適的數據結構在你的文件中。我建議先從這本書作爲一個選項良好的目錄:
http://www.amazon.com/Introduction-Algorithms-Second-Thomas-Cormen/dp/0262032937
你要選擇你最常用的操作與最佳的平均數據結構和最壞情況下的運行時間。
好運
謝謝你的建議,我會考慮這個的 – rda3mon 2010-11-03 01:53:38
你可以使用數據庫嗎?管理這樣一個大文件將是一件痛苦的事情。
編輯:如果文件要求主要是爲了避免機器通信故障,停機時間和類似的情況,也許你可以使用嵌入式數據庫。這樣你就可以從大文件操作問題中解脫出來,並且仍然使用數據庫可以給你的所有優點。我已經使用Apache Derby作爲嵌入式數據庫,並獲得了精彩的結果。 Java DB是Oracle支持並基於Derby。
您忽略了很多細節,但...
鍵是否是靜態的?什麼值呢?他們是否固定大小?爲什麼不使用數據庫?
如果您不想使用數據庫,請使用內存映射文件。
鍵是靜態的,但在飛行中我必須改變值如果需要的話 – rda3mon 2010-11-03 01:52:09
老問題,但這是一個日誌文件的情況。每次刪除時,您都不想複製十億條記錄。這可以通過將所有「事務」或更新記錄到新的單獨文件來解決。這些文件應該分解成合理的大小。
要讀取元組,您需要從最新的日誌文件開始,直到找到您的密鑰,然後停止。要更新或插入,只需在最近的日誌文件中添加一條新記錄。刪除仍然是一個日誌條目。
批量合併過程需要定期運行,它將掃描每個日誌文件並寫出另一個主文件。當它被讀取時,每個NEW鍵都被寫入到新的主鍵中,並且重複(舊)鍵被跳過,直到完成。如果您遇到刪除記錄,請將其標記在單獨的刪除列表中,跳過該記錄並使用該鍵忽略後續記錄。
這聽起來很簡單,但請記住,您可能想要阻止/分塊您的文件,因爲您可能會反向掃描所述日誌文件,或者至少將最大大小寫入並反向寫入而不是讀取。
我已經用數十億行數據完成了這件事。你只是在重新發明順序訪問數據庫。
- 1. 存儲1億個鍵值對
- 2. 如何存儲和查詢數十億鍵 - 值對
- 3. 保留文件上傳後的文件對象值在一個窗體中
- 4. 如何在數組中保留最大數量的十個值?
- 5. Redis中超過40億個關鍵值對?
- 6. 什麼時候使用json在postgres中的鍵/值表中爲數十億行
- 7. Nodejs將數十億的圖像存儲在文件系統中
- 8. 在WordPress中保存多個鍵/值對
- 9. 數值在數組中排序後,用鍵保留鍵值?
- 10. 對象保留鍵映射
- 11. 保留JSON鍵值對中值的換行符
- 12. 在becomeFirstResponder或resignFirstResponder事件中將對象保留在鍵盤上?
- 13. 在超過十億個文件的目錄上執行「tar」時,進程停留在D狀態
- 14. 保存60億個浮動文件以方便在文件中訪問
- 15. 以編程方式在plist文件中添加鍵值對,保留文件的現有順序
- 16. 在另一個apk文件中保留一個apk文件
- 17. 在R中保留預先指定的十進制值
- 18. 將對象鍵值排序推入數組時保留對象鍵值排序
- 19. 對面array_filter,以保持一定的值,並保留鍵
- 20. 排序十億學生
- 21. 在jquery中保留文本框的值
- 22. 使用DbContext中的同一個鍵保留多個對象
- 23. 由值對數組排序,然後通過鍵保留值
- 24. 變化後綴,前綴數十億個文件的目錄中的
- 25. 如何在「數據庫」中管理數百萬/十億個小值
- 26. 在選擇多個框中保留值
- 27. 在數組中保留一個值
- 28. 如何只保留文本文件中的一些關鍵字
- 29. 保存鍵 - 值對
- 30. 在V8中保留UINT64值
我敢肯定你考慮過使用數據庫嗎? – EboMike 2010-11-03 01:24:35
它會是什麼類型的文件?如果需要,你將如何打開它?任何10億記錄檔案將會開放嗎?可能在一週內?爲什麼不使用數據庫?反正好運好友。如果有什麼東西擋住你,嘗試和再來。 :) – zod 2010-11-03 01:26:48
嘗試Redis http://code.google.com/p/redis/ – 2010-11-03 01:27:32