2013-05-30 36 views
1

就在如何處理對網站的多媒體內容的共識摸索一段時間後(使用本地文件系統或數據庫中的BLOB),主要是在這裏:優化的文件系統的目錄結構(通過數據庫中引用)

MySQL Binary Storage using BLOB VS OS File System: large files, large quantities, large problems

我已經決定直接在文件系統上保存並在數據庫中放入路徑引用。我基本上正在開發一個Web應用程序,它將包含大量圖像(主要在5MB10MB之間)和視頻(主要在50MB100MB左右)。

有人可以建議我什麼是最好的方式來組織我的照片和視頻在文件系統上。我學到的流行解決方案是將文件分散到各個子目錄中。

我不清楚,爲什麼我們要從反面開始使用文件的基本名稱?我嘗試了文件名的兩個字符(假設從背面完成)的組合,然後創建目錄的層次結構樹。我無法發現目錄樹寬度或高度的差異。

而且,由於可能會有大量的照片和視頻,我的優先級必須是什麼,優化目錄樹的高度或目錄樹的寬度?

+0

目錄查找速度取決於目錄和大小以及目錄高速緩存。大小(條目數),因爲第一次打開文件時必須掃描目錄。因此,如果您可以限制目錄的數量和執行第一次查找所需的目錄條目的數量,那就是一個勝利。哈希目錄名稱可能適合於此。重複的搜索應找到緩存的目錄信息。節省掃描時間。在某些系統上,如Solaris。這稱爲目錄inode緩存調整調整,涉及系統設置。 –

+0

@jimmcnamara我應該如何爲目錄緩存創建最佳解決方案?因爲所有目錄的累計大小並不在我的控制範圍內 – activatedgeek

+0

同時適用於兩者。簡單示例:具有良好雪崩的散列可以讓您創建100個目錄。良好的雪崩意味着散列碼將文件非常均勻地散佈在各個目錄中。所以。將文件名稱存儲爲十進制數字(或某種字符串)。使用該數字/字符串的前兩個字符作爲目錄名稱。將文件寫入該目錄。在某種程度上,我猜測你的應用程序的實際使用。隨着目錄中條目的數量增加,掃描時間也會增加。我假設你給了一個正確的文件名稱來查找。 –

回答

0

對此可能會遲到。但是一種解決方案(如果它適合你的用例)可能是文件名哈希。這是一種使用文件名創建容易重現的文件路徑,同時創建分佈良好的目錄結構的方法。例如,你可以使用文件名的散列碼的字節,因爲它的路徑:

String fileName = "cat.gif"; 
int hash = fileName.hashCode(); 
int mask = 255; 
int firstDir = hash & mask; 
int secondDir = (hash >> 8) & mask; 

這將導致在路徑中:

/172/029/cat.gif 

然後,您可以通過再現找到的目錄結構cat.gif算法。

使用HEX作爲目錄名稱是一樣容易轉換int值:

String path = new StringBuilder(File.separator) 
     .append(String.format("%02x", firstDir)) 
     .append(File.separator) 
     .append(String.format("%02x", secondDir) 
     .toString(); 

,導致:文章

/AC/1D/cat.gif 

我寫了和這個幾年前和最近移動它到中等。它有一些更多的細節和一些示例代碼:File Name Hashing: Creating a Hashed Directory Structure。希望這可以幫助!