Bash

減少讀取 bash 中許多文件內容的 HDD 尋軌時間

  • December 27, 2021

我讀取了子目錄中的數百萬個文件/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

findAFAIK 是檢索文件的最快方法之一。

“硬碟扇區”在這裡無關緊要;儲存和訪問文件夾內容的方式與儲存設備的塊結構幾乎沒有關係(但取決於您的文件系統)。

你的 PHP 程式碼效率很低(我會責怪 PHP —— PHP 的標準庫使得編寫高效的程式碼變得非常困難)而且也不正確——如果有任何比 4 層文件夾更深的東西(你實際上需要編寫一些通過目錄遞歸的東西,這不是你這樣做的方式)。

無論如何,bash這很容易:

shopt -s globstar
for file in **/** ; do
 echo "${file} found!"
done

但是,如果您需要 PHP 中的文件列表,這確實對您沒有幫助。您不需要萬用字元來遍歷目錄 - 事實上,這顯然是錯誤的工具。使用 PHP 的方法列出目錄,並且每當您找到一個目錄時,在您剛剛找到的目錄上呼叫相同的方法。

引用自:https://unix.stackexchange.com/questions/683989