2010-11-10 7 views
6

me gustaría recorrer un directorio en el disco duro y buscar a través de todos los archivos para una cadena de búsqueda específica. Esto suena como el candidato perfecto para algo que podría (o debería) hacerse en paralelo ya que el IO es bastante lento.tareas de la Biblioteca paralelo para recorrido de directorio

Tradicionalmente, escribía una función recursiva para encontrar y procesar todos los archivos en el directorio actual y luego recurse en todos los directorios en ese directorio. Me pregunto cómo puedo modificar esto para ser más paralelo. Al principio simplemente Modificado:

foreach (string directory in directories) { ... } 

a

Parallel.ForEach(directories, (directory) => { ... }) 

pero siento que esto podría crear demasiadas tareas y obtener sí en nudos, sobre todo cuando se trata de enviar de nuevo en un hilo de interfaz de usuario. También siento que el número de tareas es impredecible y que esta podría no ser una forma eficiente de paralizar (¿es una palabra?) Esta tarea.

Alguien ha hecho con éxito algo como esto antes? ¿Qué consejo tienes al hacerlo?

+0

1 Me alegro de Jon disipó la teoría porque yo también estaba pensando que este sería un buen candidato. Parece que Microsoft ni siquiera puede hacerlo correctamente: http://msdn.microsoft.com/en-us/library/ff477033.aspx -> lea el comentario en la parte inferior :) –

Respuesta

15

No, esto no suena como un buen candidato para el paralelismo precisamente porque el IO es lento. Estarás en el disco. Suponiendo que solo tiene un disco, realmente no desea hacer que busque múltiples lugares diferentes al mismo tiempo.

Es un poco como tratar de conectar varias mangueras al mismo grifo con el fin de sacar el agua más rápido - o tratando de ejecutar 16 hilos vinculados a la CPU en un solo núcleo :)

+0

Eso tiene sentido. ¿Sería entonces más beneficioso hacer que un hilo haga todo el disco-IO y que otros analicen los archivos? – rein

+3

@rein: si el análisis de los datos requiere una cantidad significativa de tiempo, entonces podría tener sentido hacerlo por separado de la lectura síncrona, sí. Sin embargo, si el IO es el cuello de botella más significativo, puede que no gane mucho, pero haga que el código sea mucho más complejo. Es posible que considere tener un hilo que haga IO sincrónico y que entregue datos a otro hilo para hacer todo el análisis sintáctico. Vale la pena experimentar –

Cuestiones relacionadas