web-dev-qa-db-ja.com

多数の個別のファイルに分散している場合、同じ量のデータのコピーに時間がかかるのはなぜですか?

24Mb相当のデータをあるフォルダから別のフォルダにコピーするのに約30秒かかることに気づきました。これは(これが理由だと思いますが)1,000を超える個別のファイルであったためです。 24Mbのコピーはそれほど長くはかからないはずです。ファイルの数が異なるのはなぜですか?

MacBookでWindows7を実行しています(4GB RAM、Intel(R)Core(TM)2 Duo CPU P7450 @ 2.13GHz、32ビットオペレーティングシステム)

編集:NTFSはドライブで使用されるファイルシステムです

12
Trindaz

HDDには正確な転送速度がありません。適切なメンテナンスに依存します。つまり、断片化されていないか、不良セクタなどがありません。

HDDがSATA2であり、同じパーティションである場合、それはデータ転送の速度のみです。

同じHDDに2つのパーティションがある場合、バスとマザーボード間でこのデータ転送を行う必要はありません。つまり、バッファにロードされます。 (その後、hddバッファサイズに依存します。)

ただし、コピーされるファイルごとに、システムはそのインデックスをHDDのMFT(マスターファイルテーブル)に保持する必要があります。これにより、多数のファイルをコピーすると、コピープロセスが遅くなります。また、アンチウイルスがある場合は、コピーされた各ファイルをスキャンします。また、Microsoft検索ファイルのインデックス作成(またはその他のファイルインデックス作成サービス)を有効にしている場合、結果はさらに悪化します。

多くのファイルのコピーが遅くなる理由は他にもたくさんあると思いますが、これらが主な理由です。

5
Realcool

ファイルの数が異なるのはなぜですか?

どうやらあなたは「ファイルをコピーする」の「データをコピーする」側面だけに焦点を合わせているようです。ファイルは単なるデータではありません。 ファイルシステムのエンティティです。ファイルには、名前、属性、およびアクセス許可があります。 「ファイルがコピーされる」とき、ファイルに関するこの追加情報はすべて、データと一緒に複製する必要があります。このファイルシステムのオーバーヘッドを実行するには、かなりの量のディスクI/Oがあります。

汎用ファイルシステムで1つのファイルをコピーする手順は次のようになります。

  • ファイルシステムでソースファイルを見つけます。 (a)
  • ソースファイルのディレクトリエントリをディスクから読み取ります。
  • 読み取り権限を確認します。
  • ファイルシステムで宛先ファイルを見つけます。 (b)
  • 宛先ディレクトリの書き込み権限を確認してください。
  • 新しいファイルに対応するために、必要に応じてディレクトリを展開します。 (c)
  • ディスク上のディレクトリを更新します。 (c1)
  • 空きブロックを見つけて割り当て、テーブルを再度更新します。 (d)
  • ファイルデータを読み取り、宛先ファイルにコピーします(つまり、「ファイル」をコピーします)。
  • 新しいファイルのディレクトリエントリを(サイズと時間)で更新します。 (e)
  • ソースディレクトリエントリのアクセス時間を更新します。 (f)

(a)少なくとも、これは現在のディレクトリを検索することを意味します。または、パスがファイルシステムのルートから始まる場合があり、ディレクトリのいくつかのレベルをトラバースする必要があります。

(b)少なくとも、これは現在のディレクトリを検索することを意味します。または、パスがファイルシステムのルートから始まり、いくつかのレベルのディレクトリをトラバースする必要がある場合があります。宛先ファイルがすでに存在する場合は、コピーを続行または中止する方法を決定します。宛先ファイルが存在しない場合は、新しいディレクトリエントリを作成する必要があります。これには、ディレクトリの拡張が含まれる場合があります(つまり、ファイルブロック(別名クラスタ)割り当てオーバーヘッド)。

(c)ディレクトリを拡張する必要がある場合は、空きブロックを見つけて新しいブロックを割り当てます。modify割り当てテーブル新しい割り当てで、次にwriteブロックをディスクに出力します。ほとんどのファイルシステムは割り当てテーブルの複数のコピーを維持しているため、ディスクへの複数の書き込みを意味します。
(c1)宛先ディレクトリが見つかったら、readディスクからディレクトリブロックmodifyコピーしたファイルの新しいディレクトリエントリで変更してから、writeブロックディスクに出力します。

(d)ファイルをコピーするには、空きブロックを見つけてブロックを割り当て、modify新しい割り当てで割り当てテーブルを変更します、次にwriteブロックをディスクに出力します。ほとんどのファイルシステムは割り当てテーブルの複数のコピーを維持しているため、ディスクへの複数の書き込みを意味します。データの整合性を維持するために、ファイルシステムはディレクトリと割り当てテーブルのディスク書き込み操作を合体(遅延およびマージ)しようとせず、代わりに新しいファイルが作成され、ブロックが割り当てられるとすぐに操作を書き込みます。

(e)データのコピーが完了すると、update適切なファイル長のコピーされたファイルの新しいディレクトリエントリとタイムスタンプ、次にwriteディレクトリブロックをディスクに出力します。

(f)Update新しい「アクセス」タイムスタンプを使用してソースディレクトリエントリを更新し、次にwriteディレクトリブロックをディスクに出力します。

それで、あなたの質問は、1つのファイルだけでなく、1000のファイルに対してこれらすべてのことを行うと、ファイルのデータ部分をコピーするのにかかる時間が増える可能性があるかどうかを尋ねています。 24MBのファイルを1つだけコピーすると、1,000ファイルのコピー時間と比較できるものがあります。

バックアップファイルシステムの場合、ディスクまたはパーティション上の別のファイルシステムに個々のファイルをコピーすることはめったに使用されません。これは、ご存知のようにプロセスがかなり遅いためです。 。より高速な方法は、ソースディレクトリエントリとファイルの内容を特別なファイル形式で保持する単一のarchiveファイルを作成して書き込むことです。バックアッププログラムと* nixコマンド 'tar'は、そのようなアーカイブファイルを出力できます。 (「tar」はアーカイブファイルを処理するだけで、アーカイブ+圧縮ユーティリティのように圧縮を使用しないことに注意してください。)バックアップの最速の方法は、(デバイス上のファイルシステムではなく)ブロックデバイスに書き込むことです。無視され(より多くのデータとして扱われ)、ソースデバイスのブロックごとのイメージコピーを実行できます。

30
sawdust