7

ユーザーがカウントの進行状況を確認できるように、負荷を分割する方法でディレクトリのサイズを計算しようとしています。これを行う論理的な方法は、まずディレクトリ ツリーを作成してから、すべてのファイルの長さをカウントする操作を行うことだと思いました。

予想外に思ったのは、ディスク I/O の大半がディレクトリ ツリーの作成に費やされ、その後FileInfo[]ディスク I/O がほとんどない状態でほぼ瞬時に処理されることです。

Directory.GetDirectories()ディレクトリ名の文字列のツリーを作成し、オブジェクトを使用して、両方を試しましたが、両方の方法は、すべてのforDirectoryInfoを調べるのに比べて、I/O 時間 (もちろん MFT の読み取り) の大半を必要とします。FileInfo.Length各ディレクトリ内のファイル。

ツリーを作成するために I/O を大幅に削減する方法はないと思いますが、より多くのファイルを処理する場合と比較して、この操作に時間がかかるのはなぜだろうか?

また、誰かが物事を集計するための非再帰的な方法を推奨できる場合 (サイズの集計をより応答性の高いものにするために、列挙を分割してバランスを取る必要があるようです)。ベースからサブディレクトリごとにスレッドを作成し、スケジューラの競合によってバランスがとれるようにするのは、おそらくあまり良いことではありません。

編集: このコードのリポジトリ

4

1 に答える 1

4

Parallel.ForEachを利用して、ディレクトリ サイズの計算を並行して実行できます。GetDirectories を取得し、各ノードで Parallel.ForEach を実行できます。変数を使用してサイズを追跡し、それをユーザーに表示できます。各並列計算は、同じ変数でインクリメントされます。必要に応じて、lock() を使用して並列実行間で同期します。

于 2012-06-26T17:59:32.593 に答える