私は、ユーザーがカウントの進行状況を見ることができるように負荷を分割する方法でディレクトリサイズを計算しようとしています。私はこれを行う論理的な方法は、最初にディレクトリツリーを作成し、すべてのファイルの長さを数える操作を行うことだと思った。ディレクトリのサイズを計算する
予想外のこととして、ディレクトリツリーの作成から大量の時間(ディスクI/O)が発生し、実質的にディスクI/Oがなくなり、FileInfo[]
をほぼ瞬時に処理できます。
私はDirectory.GetDirectories()
でディレクトリ名の文字列ツリーを作成し、DirectoryInfo
オブジェクトを使用してみましたが、どちらの方法もI/O時間の大部分を占めています(もちろんMFTを読む)各ディレクトリ内のファイルについてすべてFileInfo.Length
を参照してください。
ツリーを大きくするためにI/Oを減らす方法はないと思うが、私はこの操作がより多くのファイルを調べるのに比べてかなり長い時間を要すると思うだろうか?
また、誰かが再帰的なやり方で物事を集計することを勧めてもいいです(私はちょうど列挙を分割し、サイズをもっと反応的にするためにバランスをとる必要があるからです)。サブディレクトリごとにスレッドをベースから外して、スケジューラの競合のバランスを取ることはおそらくあまり良くないでしょうか?
私はディレクトリサイズの計算にも苦労しました。私はあなたがしたことを正確に行った。 > fileInfo []を試してから、Directory.GetDirectories()を試してみてください。しかし、私はまだもっと良い方法を知らない。 –
GetDirectories()を呼び出すのに時間がかかると言っていますか?私はそれを見たことはありませんが、もう一度、私は大量のディレクトリでこれをやったことはありません。また、なぜその再帰的な場合あなたは気になるでしょうか?これは再帰的な作業であり、ネストされたディレクトリは決して爆発することはありません。 –
を参照してください。http://stackoverflow.com/questions/468119/whats-the-best-way-to-calculate-the-size-of-a-directory-in-net –