0

複数のディレクトリからディレクトリに大量のファイルをコピーするプログラムがあります。量は不明ですが (約 50K)、それらはすべて同じドライブ上にあります。プログラムには進行状況バーが必要です。初めてプログラムを書いたとき、プログレスバーを書いておらず、プログラムの実行が遅くなりました。ファイルを渡すのに約15〜20分かかりました。進行状況バーを書き込むために、ファイルの数を知る必要があったため、ディレクトリを調べてファイルをリストしました。ファイルの最初の実行には約 5 分かかりますが、コピーには 5 ~ 7 分しかかかりません。

誰でも現象を説明できますか?コードを共有できなくて申し訳ありませんが、単純な使用方法File.Copyと単純な c# .net 3.5 です。progressBar

4

2 に答える 2

4

このアプローチは、ディスク ドライブで最もコストのかかる操作を最小限に抑え、リーダー ヘッドを移動します。ディスク速度は、2 つの基本的な機械的制約によって評価されます。1 つは、データ転送速度の上限を設定するプラッターの回転速度です。それは修正されました。また、読み取りヘッドを別のトラックに移動できる速さ。シーク時間は、1 トラック移動するのに数十ミリ秒かかるのが一般的です。CPUサイクルの非常に長い時間。そのため、ディスク データにアクセスする順序が非常に重要になります。最初に行ったように、リーダー ヘッドをディレクトリ レコードとファイル データ クラスターの間で常に行ったり来たりすると、非常にコストがかかります。

ディスク上のデータがどの程度断片化されているかも非常に重要であり、デフラグ ユーティリティが存在する理由です。ファイルの作成と削除が頻繁に行われるドライブは、断片化が早くなる傾向があります。断片化率が高いほど、ドライブからデータを読み取るために必要なディスク シークが多くなります。

最初にディレクトリ エントリを読み取ることで、多くのシークを回避できます。それらは、MFT と呼ばれるドライブの領域にローカライズされ、物理的に互いに近いため、長時間のシークがはるかに少なくなります。実際にファイルのコピーを開始するときに再度読み取りますが、今回はファイル システム キャッシュからのものです。初めてディレクトリをスキャンしたときに RAM に保存されます。そのため、MFT に戻って高価なシークを行う必要はありません。

また、SSD が機械式ドライブよりもはるかに優れた動作をする理由として、シーク時間が非常に短いことも注目に値します。

于 2013-07-10T11:36:23.967 に答える