/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でコード全体を書き換えることができます。
私の質問を再現しましょう。入れ子になったフォルダ(HDD、ext4を含む)に保存されている何百万ものファイルの内容を最も速く読み取るには?
ベストアンサー1
ここで「HDDセクタ」は重要ではない。フォルダの内容が保存されアクセスされる方法は、ストレージデバイスのブロック構造とほとんど関係ありません(ただし、ファイルシステムによって異なります)。
あなたのPHPコードは非常に非効率的です。 (私はPHPを非難しています。PHPの標準ライブラリのため、効率的なコードを書くのは非常に難しいです)。フォルダの4つのレベルより深いものがある場合(実際に何かを書く必要があります)再帰ディレクトリを通してはできません)。
とにかくbash
簡単です。
shopt -s globstar
for file in **/** ; do
echo "${file} found!"
done
ただし、これはPHPでファイルのリストが必要な場合は実際には役に立ちません。ディレクトリを参照するためにワイルドカードは必要ありません。実際、これは明らかに間違ったツールです。 PHPのメソッドを使用してディレクトリを一覧表示し、ディレクトリが見つかるたびに見つけたディレクトリから同じメソッドを呼び出します。