Effizientere Methode zum Ermitteln der Verzeichnisgröße

8

Ich habe bereits eine rekursive Funktion erstellt, um die Verzeichnisgröße eines Ordnerpfads zu erhalten. Es funktioniert, aber mit der wachsenden Anzahl von Verzeichnissen, die ich durchsuchen muss (und Anzahl der Dateien in jedem entsprechenden Ordner), ist dies eine sehr langsame, ineffiziente Methode.

%Vor%

Dadurch werden alle Unterverzeichnisse nach dem Argumentpfad durchsucht, so dass das dirFiles -Array ziemlich groß wird. Gibt es eine bessere Methode, dies zu erreichen? Ich habe gesucht, aber noch nichts gefunden.

Eine andere Idee, die mir in den Sinn kam, war, die Ergebnisse in einen Zwischenspeicher zu stellen. Wenn die Funktion erneut aufgerufen wird, versuchen Sie, die Unterschiede zu finden und durchsuchen Sie nur die Ordner, die sich geändert haben. Nicht sicher, ob das auch eine gute Sache ist ...

    
ikathegreat 22.03.2012, 22:42
quelle

5 Antworten

24

Sie scannen zuerst den Baum, um eine Liste aller Dateien zu erhalten. Dann öffnest du jede Datei erneut, um ihre Größe zu erhalten. Dies führt zu einem doppelten Scannen.

Ich schlage vor, dass Sie DirectoryInfo.GetFiles verwenden, die Ihnen FileInfo-Objekte direkt übergeben. Diese Objekte sind mit ihrer Länge ausgefüllt.

In .NET 4 können Sie auch die EnumerateFiles-Methode verwenden, die Ihnen ein faules IEnumable zurückgibt.

    
usr 22.03.2012, 22:49
quelle
10

Dies ist kryptischer, aber es dauerte etwa 2 Sekunden für 10k Ausführungen.

%Vor%     
MrFox 22.03.2012 23:12
quelle
10

Versuchen Sie

%Vor%

Dies hat 700.000 in 70 Sekunden auf dem Desktop-NON-RAID P4 gemacht. So wie 10.000 pro Sekunde. Auf der Server-Klasse Maschine sollte 100.000+ / Sekunde leicht zu bekommen.

As usr (+1) hat angegeben, dass EnumerateFile mit Länge gefüllt ist.

    
paparazzo 22.03.2012 23:24
quelle
4

Mit EnumerateFiles() anstelle von GetFiles() kannst du deine Funktion etwas beschleunigen. Zumindest werden Sie nicht die vollständige Liste im Speicher laden.

Wenn es nicht genug ist, sollten Sie Ihre Funktion more komplex mit Threads machen (ein Thread pro Verzeichnis ist zu viel, aber es gibt keine allgemeine Regel).
Sie können eine feste Anzahl von Threads verwenden, die Verzeichnisse aus einer Warteschlange durchsuchen, jeder Thread berechnet die Größe eines Verzeichnisses und addiert zur Gesamtsumme. Etwas wie:

  • Ruft die Liste aller Verzeichnisse (keine Dateien) ab.
  • Erstellen Sie N Threads (zum Beispiel einen pro Kern).
  • Jeder Thread durchsucht ein Verzeichnis und berechnet die Größe.
  • Wenn sich kein anderes Verzeichnis in der Warteschlange befindet, endet der Thread.
  • Wenn es ein Verzeichnis in der Warteschlange gibt, berechnet es seine Größe und so weiter.
  • Die Funktion endet, wenn alle Threads beendet sind.

Sie können den Algorithmus, der die Suche von Verzeichnissen über alle Threads umfasst, erheblich verbessern (wenn ein Thread beispielsweise ein Verzeichnis analysiert, fügt er der Warteschlange Ordner hinzu). Es ist Ihnen überlassen, es komplizierter zu machen, wenn Sie sehen, dass es zu langsam ist (diese Aufgabe wurde von Microsoft als Beispiel für das neue Aufgabe parallele Bibliothek ).

    
Adriano Repetti 22.03.2012 22:52
quelle
-1
%Vor%     
Shai Segev 22.08.2016 20:16
quelle

Tags und Links