fs.readdirSync の速度はどれくらいですか?速度を上げることはできますか?
P粉064448449
2023-09-04 19:48:56
<p>fs.readdirSync を使用してディレクトリ内のすべてのファイルを再帰的に取得する関数があります。
テストとして実行した小さなディレクトリでは正常に動作しましたが、現在は 100 GB を超えるディレクトリで実行しているため、完了するまでに時間がかかります。これを高速化する方法、またはより良い方法があるかどうかについてのアイデアはありますか?最終的には、テラバイトのデータを含むいくつかのディレクトリでこれを実行する必要があります。 </p>
<pre class="brush:php;toolbar:false;">// ファイルを取得する再帰関数
function getFiles(dir, files = []) {
// fs.readdirSync を使用して、渡されたディレクトリ内のすべてのファイルとディレクトリの配列を取得します
const fileList = fs.readdirSync(dir);
// 渡されたディレクトリとファイル/ディレクトリ名を連結して、ファイル/ディレクトリのフルパスを作成します
for (fileListのconstファイル) {
const name = `${dir}/${file}`;
// 現在のファイル/ディレクトリが fs.statSync を使用してディレクトリであるかどうかを確認します
if (fs.statSync(name).isDirectory()) {
// ディレクトリの場合は、ディレクトリ パスとファイル配列を指定して getFiles 関数を再帰的に呼び出します。
getFiles(名前, ファイル);
} それ以外 {
// ファイルの場合は、ファイル配列へのフルパスをプッシュします
ファイル.push(名前);
}
}
ファイルを返す。
}</pre></p>
残念ながら、
Async
は遅いです。したがって、コードを最適化する必要があります。これは{withFileTypes:true}
オプションを使用して行うことができ、2 倍高速になります。ノード v20 の
{recursive:true}
オプションも試しましたが、解決策よりもさらに遅かったです。withFileTypes
では機能しません。読み取り速度の高い、より優れた SSD が役立つかもしれません。ファイル エントリはファイル システム インデックスから読み取られると思いますが、ハードウェアがそれにどのような影響を与えるかはわかりません。
リーリー出力:
リーリー