Bash
減少讀取 bash 中許多文件內容的 HDD 尋軌時間
我讀取了子目錄中的數百萬個文件
/XX/XX/XX/
來處理每個文件的內容。在 PHP 中,我將文件讀取為foreach(glob("/folder/*") as $a){ foreach(glob("$a/*") as $b){ foreach(glob("$b/*") as $c){ foreach(glob("$c/*") as $file){ // Processing } } } }
問題是這段程式碼以特定順序獲取文件,但我只需要以任何可能的順序讀取所有文件(搜尋時間最短)。
有沒有辦法以某種順序(儲存在 HDD 扇區上)讀取文件以減少查找時間?
PHP 程式碼是為了顯示我是如何在這裡結束的,不要指望在 PHP 中找到解決方案。我的問題確實是關於
shell
.更新:
我沒有清楚地描述這個問題。我已經有了完整的文件列表。問題不在於找到它們,而在於閱讀它們的內容以減少查找時間的最佳順序。
我嘗試使用
glob
而不是foreach($files as $file){ $content=file_get_contents($file); }
希望減少每個文件的查找時間。
正如我之前所說,語言並不重要。我可以用 bash 或 C 重寫整個程式碼。
我重新提出我的問題:讀取儲存在嵌套文件夾(帶有 ext4 的 HDD)中的幾百萬個文件的內容的最快方法是什麼?
我建議
find
find /folder/ -mindepth 3 -maxdepth 3 -type f
然後,這取決於您喜歡使用
-exec
還是.-execdir``-print0 | xargs -0
find
AFAIK 是檢索文件的最快方法之一。
“硬碟扇區”在這裡無關緊要;儲存和訪問文件夾內容的方式與儲存設備的塊結構幾乎沒有關係(但取決於您的文件系統)。
你的 PHP 程式碼效率很低(我會責怪 PHP —— PHP 的標準庫使得編寫高效的程式碼變得非常困難)而且也不正確——如果有任何比 4 層文件夾更深的東西(你實際上需要編寫一些通過目錄遞歸的東西,這不是你這樣做的方式)。
無論如何,
bash
這很容易:shopt -s globstar for file in **/** ; do echo "${file} found!" done
但是,如果您需要 PHP 中的文件列表,這確實對您沒有幫助。您不需要萬用字元來遍歷目錄 - 事實上,這顯然是錯誤的工具。使用 PHP 的方法列出目錄,並且每當您找到一個目錄時,在您剛剛找到的目錄上呼叫相同的方法。