2009-07-29 16 views
8

Estoy buscando un número moderado (~ 500) de carpetas para un gran número (~ 200.000) de los archivos de una aplicación .NET.DirectoryInfo.GetFiles lento al usar SearchOption.AllDirectories

me esperaba utilizar DirectoryInfo.GetFiles, pasando SearchOption.AllDirectories. Sin embargo, este enfoque parece ser mucho más lento que escribir mi propio código para iterar a través de los directorios y hacer GetFiles acaba de pasar en un searchPattern.

relacionados MSDN info:

  • GetFiles(String)
    Devuelve una lista de archivos del directorio actual que coincida con el searchPattern dado.
  • GetFiles(String, SearchOption)
    Devuelve una lista de archivos del directorio actual que coincida con el searchPattern dado y utilizando un valor para determinar si se debe buscar subdirectorios.

Alguien ha tenido una experiencia similar a esta?

Respuesta

13

Estas dos funciones son realmente conocidos por su rendimiento. La razón es que GetFiles recorre todo el árbol de directorios y construye una matriz de objetos FileInfo, y solo luego devuelve el resultado a la persona que llama. La construcción de dicha matriz implica una gran cantidad de asignaciones de memoria (estoy seguro de que usan List internamente, pero aún así) ya que no se puede conocer el número de entradas antes de tiempo.

Si usted está realmente en el rendimiento, puede P/Invoke en FindFirstFile/FindNextFile/FindClose, abstraerlos en un FileInfo s uno IEnumerable<FileInfo> y yield a la vez.

+1

respuesta Niza y buen ejemplo del uso de rendimiento. – RichardOD

1

El enfoque que Anton mencionó usando FirstFirstFile() y métodos nativos relacionados se ha implementado a partir de .NET 4 a través de DirectoryInfo.EnumerateFiles(), por lo que ya no es necesario utilizar P/Invoke para esto.

Cuestiones relacionadas