ユーザーがカウントの進行状況を確認できるように、負荷を分割する方法でディレクトリのサイズを計算しようとしています。これを行う論理的な方法は、まずディレクトリ ツリーを作成してから、すべてのファイルの長さをカウントする操作を行うことだと思いました。
予想外に思ったのは、ディスク I/O の大半がディレクトリ ツリーの作成に費やされ、その後FileInfo[]
ディスク I/O がほとんどない状態でほぼ瞬時に処理されることです。
Directory.GetDirectories()
ディレクトリ名の文字列のツリーを作成し、オブジェクトを使用して、両方を試しましたが、両方の方法は、すべてのforDirectoryInfo
を調べるのに比べて、I/O 時間 (もちろん MFT の読み取り) の大半を必要とします。FileInfo.Length
各ディレクトリ内のファイル。
ツリーを作成するために I/O を大幅に削減する方法はないと思いますが、より多くのファイルを処理する場合と比較して、この操作に時間がかかるのはなぜだろうか?
また、誰かが物事を集計するための非再帰的な方法を推奨できる場合 (サイズの集計をより応答性の高いものにするために、列挙を分割してバランスを取る必要があるようです)。ベースからサブディレクトリごとにスレッドを作成し、スケジューラの競合によってバランスがとれるようにするのは、おそらくあまり良いことではありません。
編集: このコードのリポジトリ