大量の小さなファイルを転送する際のボトルネックは何ですか?

大量の小さなファイルを転送する際のボトルネックは何ですか?

ソース コードを含むフォルダーのコレクションのバックアップを作成しているときに (後で、 などのライブラリ ファイルを含む特定のフォルダーを除外できることに気付きましたnode_modules)、ファイル転送速度が極端に低下していることに気付きました (バックアップ ドライブで許可される通常の 60 mb/s に対して、数 kb/s)。

ボトルネックがどこにあるか理解したいです。純粋な I/O とインターリーブして全体の速度を低下させる計算を実行する必要があるのでしょうか、それとも、ターゲット ドライブのファイル システム インデックスに、ファイル間で取得および解放する必要がある中央ロックがあるのでしょうか。

ターゲット バックアップ ドライブでは NTFS を使用しており、これは HDD です。

答え1

問題は、ハードディスク上のファイルの場所を示すファイル システム カタログに複数回アクセスする必要があることです。

各ファイルに対してコピーでは次の操作を実行する必要があります。

  • ソースカタログからソースファイルを開く
  • ターゲットカタログにターゲットファイルを作成する
  • ファイルをコピーする
  • ソースファイルを閉じて、そのカタログエントリを既読としてマークします
  • ターゲット ファイルを閉じて、そのカタログ エントリを作成済みとしてマークします。

これにより、各ファイルのコピー中に、ソース ディスクとターゲット ディスクの両方のヘッドがカタログ内のファイル メタデータからファイル自体に数回切り替わります。

SSD ではこれはあまり問題になりませんが、HDD では多数の小さなファイルのコピーが極端に遅くなる可能性があります。基本的に、HDD は主にヘッドを動かしているため、読み取りや書き込みよりもはるかに遅い操作です。

ファイルを閉じるとディスクにフラッシュされるため、Windows では RAM をキャッシュとして効果的に使用することもできません。

関連情報