Necesito ejecutar muchos comandos similares en el menor tiempo posible y utilizando todos los recursos disponibles.
Por ejemplo, mi caso es el procesamiento de imágenes, cuando uso el siguiente comando:
for INPUT in *.jpg do; some_command; done
el comando se ejecuta uno por uno y no utiliza todos los recursos disponibles.
Pero, por otro lado, la ejecución for INPUT in *.jpg do; some_command &; done
hace que la máquina se quede sin recursos en muy poco tiempo.
Conozco at
el batch
comando, pero no estoy seguro de poder usarlo en mi caso. Corrígeme si estoy equivocado.
Entonces estaba pensando en poner los comandos en algún tipo de cola y ejecutar solo una parte de ellos a la vez. No sé cómo hacerlo de forma rápida y ese es el problema. Estoy seguro de que alguien tuvo un problema similar antes.
Por favor avise.
Respuesta1
GNU Parallel está hecho exactamente para esto:
parallel some_command {} ::: *.jpg
El valor predeterminado es un trabajo por núcleo de CPU. En su caso, es posible que desee ejecutar un trabajo más de los que tiene núcleos:
parallel -j+1 some_command {} ::: *.jpg
GNU Parallel es un paralelizador general y facilita la ejecución de trabajos en paralelo en la misma máquina o en varias máquinas a las que tiene acceso ssh.
Si tiene 32 trabajos diferentes que desea ejecutar en 4 CPU, una forma sencilla de paralelizar es ejecutar 8 trabajos en cada CPU:
En cambio, GNU Parallel genera un nuevo proceso cuando uno finaliza, manteniendo las CPU activas y, por lo tanto, ahorrando tiempo:
Instalación
Por razones de seguridad, debe instalar GNU Parallel con su administrador de paquetes, pero si GNU Parallel no está empaquetado para su distribución, puede realizar una instalación personal, que no requiere acceso de root. Se puede hacer en 10 segundos haciendo esto:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Para otras opciones de instalación consultehttp://git.savannah.gnu.org/cgit/parallel.git/tree/README
Aprende más
Ver más ejemplos:http://www.gnu.org/software/parallel/man.html
Mira los vídeos de introducción:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Sigue el tutorial:http://www.gnu.org/software/parallel/parallel_tutorial.html
Regístrese en la lista de correo electrónico para obtener ayuda:https://lists.gnu.org/mailman/listinfo/parallel
Respuesta2
Puede usar GNU make con la --jobs
opción de ejecutar cosas en paralelo pero limitado a la cantidad especificada de trabajos. Puede adaptar ese número a algo que no apague su máquina.
Aquí hay un Makefile de ejemplo que usa objetivos (estos podrían ser sus archivos de salida, por ejemplo) y ejecuta un conjunto (ficticio) de comandos para cada objetivo:
all: a b c d e f g h
a b c d e f g h:
echo $@; sleep 10
NB La sangría del comando.debeser un carácter TAB. Ver elGNU hace documentaciónpara obtener más detalles sobre la sintaxis de Makefiles.
Puede invocar make with make --jobs 4
y obtener el siguiente resultado (lo usé time make --jobs 4
a continuación para mostrar el tiempo transcurrido):
echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h
real 0m20.009s
user 0m0.010s
sys 0m0.011s
Los primeros cuatro se ejecutaron en paralelo, luego los cuatro siguientes, por lo que el tiempo total transcurrido es de 20 segundos.