Dot-Net
在磁碟中儲存許多文件的最佳方法
我找不到這個問題的好標題,這就是我想要做的:
- 這是.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。