Tengo un gran conjunto de archivos para los que es necesario realizar un gran procesamiento. Este procesamiento en una sola hebra, utiliza unos cientos de MiB de RAM (en la máquina utilizada para iniciar el trabajo) y tarda unos minutos en ejecutarse. Mi uso actual es iniciar un trabajo de hadoop en los datos de entrada, pero he tenido el mismo problema en otros casos anteriormente.Ejecutando un número limitado de procesos secundarios en paralelo en bash?
Para aprovechar al máximo la potencia de la CPU disponible, quiero poder ejecutar varias de esas tareas en paralelo.
Sin embargo, un muy simple script de ejemplo concha como esto puede mandar al traste el rendimiento del sistema debido a una carga excesiva e intercambio:
find . -type f | while read name ;
do
some_heavy_processing_command ${name} &
done
Así que lo que quiero es esencialmente similar a lo que "gmake -j4" lo hace.
Sé que bash admite el comando "esperar" pero solo espera hasta que se completen todos los procesos secundarios. En el pasado he creado scripts que hacen un comando 'ps' y luego grep el niño procesa por su nombre (sí, lo sé ... feo).
¿Cuál es la solución más simple/limpia/mejor para hacer lo que quiero?
Edit: Gracias a Frederik: Sí, efectivamente se trata de un duplicado de How to limit number of threads/sub-processes used in a function in bash Los "xargs --max-procs = 4" funciona como un encanto. (Así que votaron para cerrar mi propia pregunta)
posible duplicado de http://stackoverflow.com/questions/6511884/how-to-limit-number-of-threads-used-in-a-function-in-bash que haría uso de 'xargs --max-procs = 4' para esto ... –
parece un trabajo para [GNU paralelo] (http://www.gnu.org/software/parallel/), pero no estoy seguro de que agregue más poder para 'xargs --max-procs', que no sabía – larsen
@Niels: He estado usando' screen' para este propósito, aunque es un poco desordenado de esta manera, especialmente cuando se inicia desde dentro de otra 'pantalla' sesión;) – 0xC0000022L