2009-07-29 8 views
8

.NETアプリケーションから多数のファイル(約200,000件)の中程度の数(〜500)のフォルダを検索しています。SearchOption.AllDirectoriesを使用するとDirectoryInfo.GetFilesが遅くなる

DirectoryInfo.GetFilesを使用して、SearchOption.AllDirectoriesを使用することを希望しました。しかし、このアプローチは、ディレクトリを繰り返し処理するために私自身のコードを書くよりはるかに遅くて、をちょうどsearchPatternに渡します。関連MSDN info

  • GetFiles(String)
    は、与えられたのsearchPatternに一致する、現在のディレクトリからファイルのリストを返します。
  • GetFiles(String, SearchOption)
    現在のディレクトリから指定されたsearchPatternに一致するファイルリストを返し、値を使用してサブディレクトリを検索するかどうかを決定します。

誰もこれに似た経験をしていますか?

答えて

13

これらの2つの機能は、実際には性能が悪いです。その理由は、GetFilesがディレクトリツリー全体を処理し、FileInfoオブジェクトの配列を構築し、その結果を呼び出し元に返すためです。上記の配列の構築には、多くのメモリ割り当てが必要です(私は内部でListを使用していると確信していますが、それでもなおエントリの数は事前に知ることができないためです)。

あなたはパフォーマンスに本当にしている場合は、Pは/時IEnumerable<FileInfo>yieldFileInfoの一つにそれら抽象的な、FindFirstFile/FindNextFile/FindCloseに呼び出すことができます。

+1

良い答えと利回りを使用する良い例。 – RichardOD

1

FirstFirstFile()と関連するネイティブメソッドを使用してAntonのアプローチが記述されているため、.NET 4ではDirectoryInfo.EnumerateFiles()経由で実装されているため、これ以上のP/Invokeは必要ありません。

関連する問題