Tengo tres tipos de datos que están en diferentes formatos; Para cada tipo de datos, hay un script de Python que lo transforma en un único formato unificado.
Este script de Python es lento y está vinculado a la CPU (a un solo núcleo en una máquina multinúcleo), por lo que quiero ejecutar tres instancias del mismo, una para cada tipo de datos, y combinar su salida para pasarlo sort
. Básicamente, equivalente a esto:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Pero con los tres scripts ejecutándose en paralelo.
Encontré esta pregunta en la que GNU split
se estaba utilizando para hacer un round-robin de una secuencia estándar entre n instancias de un script que maneja la secuencia.
Desde la página man dividida:
-n, --number=CHUNKS
generate CHUNKS output files. See below
CHUNKS may be:
N split into N files based on size of input
K/N output Kth of N to stdout
l/N split into N files without splitting lines
l/K/N output Kth of N to stdout without splitting lines
r/N like 'l' but use round robin distributio
Entonces el r/N
comando implica " sin dividir líneas ".
En base a esto, parece que la siguiente solución debería ser factible:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
Donde choose_script
hace esto:
#!/bin/bash
{ read x; ./handle_$x.py; }
Desafortunadamente, veo algunas líneas entremezcladas, y muchas líneas nuevas que no deberían estar allí.
Por ejemplo, si reemplazo mis scripts de Python con algunos scripts de bash simples que hacen esto:
#!/bin/bash
# ./handle_1.sh
while true; echo "1-$RANDOM"; done;
.
#!/bin/bash
# ./handle_2.sh
while true; echo "2-$RANDOM"; done;
.
#!/bin/bash
# ./handle_3.sh
while true; echo "3-$RANDOM"; done;
Veo esta salida:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
Esto es molesto: según el extracto de la página de manual que pegué anteriormente, debería mantener la integridad de la línea.
Obviamente, funciona si elimino el -u
argumento, pero luego está almacenado en el búfer y me quedaré sin memoria, ya que amortigua la salida de todos menos uno de los scripts.
Si alguien tiene alguna idea aquí, sería muy apreciado. Estoy fuera de mi profundidad aquí.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
builtin en bash, aunque realmente no veo cómo se aplica.