2012-06-26 9 views
7

Estoy tratando de calcular los tamaños de directorio de una manera que divide la carga para que el usuario pueda ver el progreso del recuento. Pensé que una forma lógica de hacer esto sería crear primero el árbol de directorios y luego hacer una operación contando la longitud de todos los archivos.Cálculo de tamaños de directorio

Lo inesperado es que la mayor parte del tiempo (E/S de disco) proviene de la creación del árbol de directorios, y luego pasar al FileInfo[] casi instantáneamente sin prácticamente ninguna E/S de disco.

He intentado con ambos Directory.GetDirectories(), simplemente creando un árbol de cadenas de nombres de directorio, y usando un objeto DirectoryInfo, y ambos métodos todavía toman la mayor parte del tiempo de E/S (leyendo el MFT por supuesto) comparado para repasar todos los FileInfo.Length para los archivos en cada directorio.

Supongo que no hay manera de reducir la E/S para hacer que el árbol sea significativo, supongo que me pregunto por qué esta operación lleva mucho más tiempo en comparación con examinar los archivos más numerosos.

Además, si alguien puede recomendar una forma no recursiva para contar cosas (ya que parece que necesito simplemente dividir la enumeración y equilibrarla para hacer que el tamaño de conteo sea más receptivo). Hacer un hilo para cada subdirectorio fuera de la base y dejar que la competencia del planificador equilibre las cosas probablemente no sería muy bueno, ¿verdad?

EDIT: Repository for this code

+0

También he tenido problemas para calcular el tamaño del directorio. He hecho exactamente lo que has hecho. Intentó> fileInfo [] y luego> Directory.GetDirectories(). Pero todavía no sé de ninguna mejor manera. –

+0

¿Estás diciendo que llamar a GetDirectories() lleva mucho tiempo? No he visto eso, pero una vez más, nunca he hecho esto con una gran cantidad de directorios. Además, ¿por qué te importaría si es recursivo? Esta es una tarea recursiva y nunca tendrás tantos directorios anidados que volarás. –

+0

consulte http://stackoverflow.com/questions/468119/whats-the-best-way-to-calculate-the-size-of-a-directory-in-net –

Respuesta

4

Puede utilizar Parallel.ForEach para ejecutar el cálculo del tamaño de directorio de forma paralela. Puede obtener GetDirectories y ejecutar Parallel.ForEach en cada nodo. Puede usar una variable para realizar un seguimiento del tamaño y mostrarlo al usuario. Cada cálculo paralelo se incrementará en la misma variable. Si es necesario, use lock() para sincronizar entre ejecuciones paralelas.

+0

Debe codificarlo de modo que solo los directorios no relacionados estén paralelizados y no haya ninguna razón para bloquearlos.Aunque con la mayoría de los discos no estoy seguro de qué paralelismo te ganará. Los IO de disco parecen sincrónicos por naturaleza. Todo lo que realmente puede hacer paralelo es la suma real de totales que deberían ser insignificantes. –

+2

Podría obtener IO paralelos con SSD ... –

+0

@JasonMalinowski Realmente ... No tenía idea. ¿La mayoría de los sistemas operativos saben cómo aprovechar eso? Sabía que era mucho más rápido debido a la parte de partes sin movimiento, no tenía idea de que también se podía conectar en paralelo. –

Cuestiones relacionadas