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)
GetFiles(String, SearchOption)
Hat jemand eine ähnliche Erfahrung gemacht?
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.
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!
Tags und Links .net file-io performance