DirectoryInfo.GetFiles verlangsamen bei Verwendung von SearchOption.AllDirectories

8

Ich suche eine moderate Anzahl (~ 500) von Ordnern für eine große Anzahl (~ 200.000) von Dateien aus einer .NET-Anwendung.

Ich habe gehofft, DirectoryInfo.GetFiles zu verwenden, indem SearchOption.AllDirectories übergeben wird. Dieser Ansatz scheint jedoch viel langsamer zu sein als das Schreiben meines eigenen Codes, um durch die Verzeichnisse zu iterieren und GetFiles nur in searchPattern zu übergeben.

Verwandte MSDN-Informationen :

  • GetFiles(String)
    Gibt eine Dateiliste aus dem aktuellen Verzeichnis zurück, die dem angegebenen searchPattern entspricht.
  • GetFiles(String, SearchOption)
    Gibt eine Dateiliste aus dem aktuellen Verzeichnis zurück, die mit dem angegebenen searchPattern übereinstimmt, und verwendet einen Wert, um zu bestimmen, ob nach Unterverzeichnissen gesucht werden soll.

Hat jemand eine ähnliche Erfahrung gemacht?

    
Richard Everett 29.07.2009, 11:55
quelle

2 Antworten

13

Diese beiden Funktionen sind eigentlich berüchtigt für ihre Leistung. Der Grund hierfür ist, dass GetFiles die gesamte Verzeichnisstruktur durchläuft und ein Array von FileInfo -Objekten erstellt und das Ergebnis erst dann an den Aufrufer zurückgibt. Die Konstruktion dieses Arrays beinhaltet eine Menge Speicherzuweisungen (ich bin sicher, dass sie List intern verwenden, aber immer noch), da die Anzahl der Einträge nicht vorher bekannt sein kann.

Wenn Sie wirklich auf Leistung Wert legen, können Sie P / Invoke in FindFirstFile / FindNextFile / FindClose , abstrahiere sie einzeln in IEnumerable<FileInfo> und yield FileInfo s.

    
Anton Gogolev 29.07.2009, 12:02
quelle
1

Der von Anton mit FirstFirstFile() und verwandten nativen Methoden erwähnte Ansatz wurde ab .NET 4 über DirectoryInfo.EnumerateFiles() implementiert, so dass P / Invoke dafür nicht mehr benötigt wird!

    
Mike Marynowski 01.11.2017 05:59
quelle

Tags und Links