2010-04-02 64 views
4

我們正在創建一個ASP.Net MVC網站,需要存儲100萬張圖片,大小約爲2k-5k。從以前的研究,它看起來像一個文件服務器可能比數據庫更好(隨意評論,否則)。如何存儲數以百萬計的大小爲2K的圖片

存儲這麼多文件時有什麼特別的考慮嗎?如果一個文件夾中有太多文件,Windows能否快速找到照片有什麼問題?是否需要創建分段的目錄結構,例如按文件名劃分它們?如果解決方案能夠擴展至少1000萬張照片以滿足潛在的未來擴展需求,那就太好了。

回答

5

4Kb是NTFS的默認羣集大小。您可能會根據通常的圖片大小調整此設置。 http://support.microsoft.com/kb/314878

我將建立與子目錄樹能夠從一個FS移動到另一個:How many files can I put in a directory? ,避免一些問題:http://www.frank4dd.com/howto/various/maxfiles-per-dir.htm

您還可以有一個包含相關圖片檔案對他們只有一個加載文件打開。可能壓縮的檔案可能是壓縮的瓶頸是I/O,如果是CPU,則不壓縮。

數據庫比較容易維護,但速度較慢......所以這取決於您!

1

假設NTFS,每卷數量(2^32 - 1)有40億個文件的限制。這是捲上所有文件夾(包括操作系統文件等)的總限制。

單個文件夾中的大量文件不應該是問題; NTFS使用B +樹進行快速檢索。 Microsoft建議您禁用短文件名稱生成(允許您將mypictureofyou.html檢索爲mypic〜1.htm的功能)。

我不知道是否有任何性能優勢分割成多個目錄;我的猜測是沒有優勢,因爲NTFS是爲具有大型目錄的性能而設計的。

如果您決定將它們分割成多個目錄,請在文件名上使用散列函數來獲取目錄名(而不是目錄名,例如文件名的第一個字母),以便每個子目錄具有大致相同數量的文件。

+0

儘管代碼可能能夠讀取包含大量全部文件的目錄中的文件,但它仍不是一個好主意。如果您曾嘗試在資源管理器中打開一個包含數千個文件的目錄,則它非常緩慢。散列入子目錄對此有很大幫助。 – Kleinux 2010-04-02 19:11:28

+1

資源管理器中的緩慢可能是由於Explorer試圖處理所有這些文件名而不是自己檢索文件名。例如,閱讀所有文件並顯示縮略圖將需要很長時間。如果您已經知道文件名,則檢索單個文件應該很快。 如果您編寫自己的系統來存儲和檢索文件,您可能會或可能不會獲得比NTFS更好的性能。 – 2010-04-05 00:52:43

1

我不排除使用內容交付網絡。他們是爲這個問題而設計的。我在Amazon S3上取得了很大的成功。由於您使用的是基於Microsoft的解決方案,因此Azure可能非常適合。

是否有某種要求阻止您使用第三方解決方案?

2

問題不在於文件系統無法在目錄中存儲如此多的文件,而是如果您想使用Windows資源管理器訪問該目錄,則需要永久使用,因此如果您需要手動訪問該目錄你應該對它進行分段,例如每2-3個名字的首字母/數字或甚至更深的結構。

如果你可以用1k的文件分割1k文件夾,那麼每個文件夾就足夠了,而且這樣做的代碼很簡單。