2012-06-26 1 views
7

Ich versuche, die Verzeichnisgrößen so zu berechnen, dass die Last geteilt wird, sodass der Benutzer den Fortschritt der Zählung sehen kann. Ich dachte, eine logische Möglichkeit wäre, zuerst die Verzeichnisstruktur zu erstellen und dann eine Operation auszuführen, die die Länge aller Dateien zählt.Berechnen von Verzeichnisgrößen

Die Sache, die mir als unerwartet kommt ist, dass der Großteil der Zeit (Disk I/O) kommt von der Erstellung der Verzeichnisbaum, dann über die FileInfo[] kommt fast sofort mit praktisch keine Festplatte I/O.

Ich habe versucht mit beiden Directory.GetDirectories(), einfach erstellen einen Baum von Strings der Verzeichnisnamen und mit einem DirectoryInfo Objekt, und beide Methoden noch immer den Großteil der E/A-Zeit (Lesen der MFT natürlich) verglichen über alle FileInfo.Length für die Dateien in jedem Verzeichnis gehen.

Ich denke, es gibt keine Möglichkeit, die I/O zu reduzieren, um den Baum signifikant zu machen, ich denke ich frage mich nur, warum diese Operation wesentlich mehr Zeit benötigt im Vergleich zu den zahlreicheren Dateien?

Auch wenn jemand eine nicht-rekursive Möglichkeit empfehlen könnte, die Dinge zu vergleichen (da es scheint, muss ich die Aufzählung einfach aufteilen und ausgleichen, um die Größe tallying reaktionsfähiger zu machen). Einen Thread für jedes Unterverzeichnis von der Basis zu erstellen und den Scheduler-Wettbewerb auszubalancieren, wäre wahrscheinlich nicht sehr gut, oder?

EDIT: Repository for this code

+0

Ich habe auch mit der Berechnung der Verzeichnisgröße gekämpft. Ich habe genau das gemacht, was du getan hast. Versucht> fileInfo [] und dann> Directory.GetDirectories(). Aber ich weiß immer noch keinen besseren Weg. –

+0

Sie sagen, dass der Aufruf von GetDirectories() lange dauert? Ich habe das nicht gesehen, aber andererseits habe ich das nie mit einer großen Anzahl von Verzeichnissen gemacht. Auch warum würde es dich interessieren, ob es rekursiv ist? Dies ist eine rekursive Aufgabe, und Sie werden nie so viele verschachtelte Verzeichnisse haben, dass Sie einen Stapel blasen werden. –

+0

siehe http://stackoverflow.com/questions/468119/whats-the-best-way-to-calculate-the-size-of-a-directory-in-net –

Antwort

4

Sie können Parallel.ForEach nutzen die Verzeichnisgröße Berechnung parallel laufen zu lassen. Sie können die GetDirectories abrufen und die Parallel.ForEach für jeden Knoten ausführen. Sie können eine Variable verwenden, um die Größe zu verfolgen und diese dem Benutzer anzuzeigen. Jede parallele Berechnung würde auf derselben Variablen inkrementieren. Verwenden Sie lock(), um zwischen parallelen Ausführungen zu synchronisieren.

+0

Sie sollten es so codieren, dass nur unbezogene Verzeichnisse parallelisiert werden und es keinen Grund gibt, darüber hinaus zu sperren.Obwohl ich bei den meisten Festplatten nicht sicher bin, welche Parallelisierung Sie gewinnen wird. Platten-IOs scheinen synchron zu sein. Alles, was Sie wirklich parallel machen können, ist die tatsächliche Addition von Summen, die vernachlässigbar sein sollte –

+2

Sie könnten parallele IOs mit SSDs bekommen ... –

+0

@JasonMalinowski Wirklich ... Ich hatte keine Ahnung. Können die meisten Betriebssysteme davon profitieren? Ich wusste, es war viel schneller wegen der keine beweglichen Teile Bit, hatte keine Ahnung, dass es parallel aktiviert auch. –