Dot-Net

在磁碟中儲存許多文件的最佳方法

  • October 17, 2011

我找不到這個問題的好標題,這就是我想要做的:

  • 這是.NET 應用程序。
  • 我需要儲存多達 200000 個對象(3KB-500KB 之間)
  • 我需要每秒從多執行緒中儲存大約 10 個
  • 我在儲存之前使用二進制序列化
  • 稍後我需要通過一個整數的唯一 ID 訪問它們

最好的方法是什麼?

  • 我無法將它們保留在記憶體中,因為我會遇到記憶體不足異常
  • 當我將它們作為單獨的文件儲存在磁碟中時,可能存在哪些性能問題?它會大大降低整體性能嗎?
  • 我是否應該實現某種記憶體,例如組合 100 個對象並將其作為一個文件寫入一次。然後稍後解析它們。或者類似的東西?
  • 應該使用數據庫嗎?(訪問時間並不重要,不會有搜尋,我只會通過已知的唯一 ID 訪問幾次)。理論上我不需要數據庫,我不想讓這個複雜化。

更新:

  • 我認為數據庫會比文件系統慢,如果您對此有所了解,請證明我錯了。所以這就是為什麼我也傾向於文件系統。但我真正擔心的是每秒寫入 200KB*10 到 HDD(這可以是任何 HDD,我不控制硬體,它是一個桌面工具,將部署在不同的系統中)。
  • 如果我使用文件系統,我會將文件儲存在單獨的文件夾中以避免與文件系統相關的問題(因此您可以忽略該限制

如果你想避免使用數據庫,你可以將它們作為文件儲存在磁碟上(為了簡單起見)。但是在單個目錄中維護大量文件時,您需要注意文件系統注意事項。

許多常見的文件系統在某種順序列表中維護每個目錄的文件(例如,簡單地一個接一個地儲存文件指針或索引節點,或者在鍊錶中。)這使得打開位於列表底部的文件真正減緩。

一個好的解決方案是將您的目錄限制為少量節點(例如 n = 1000),並在目錄下創建一個文件樹。

因此,不要將文件儲存為:

/dir/file1/dir/file2/dir/file3…/dir/fileN

將它們儲存為:

/dir/r1/s2/file1 /dir/r1/s2/file2 … /dir/rM/sN/fileP

通過以這種方式拆分文件,您可以顯著改善大多數文件系統的訪問時間。

(請注意,有一些新的文件系統表示樹中的節點或其他形式的索引。這種技術也適用於那些。)

其他考慮因素是調整文件系統(塊大小、分區等)和緩衝區記憶體,以便獲得良好的數據局部性。根據您的作業系統和文件系統,有很多方法可以做到這一點 - 您可能需要查找它們。

或者,如果這不能解決問題,您可以使用某種嵌入式數據庫,如 SQLlite 或 Firebird。

HTH。

引用自:https://stackoverflow.com/questions/2229911