parallel (bash)
- GNU Parallel actúa como un director de orquesta. No solo lanza los procesos, sino que los gestiona para que no colapsen el sistema:
- Gestión de carga: Si un proceso termina, lanza el siguiente inmediatamente.
- Orden de salida: Evita que los mensajes de error o logs de diferentes sujetos se mezclen de forma caótica en la terminal.
- Uso de memoria: Puedes limitarlo para que no sature la RAM (vital en MRI, donde cada imagen cargada consume mucho).
sudo apt install parallel
parámetros ejecución
-j <núcleos>: número de núcleos máximos a usar--progress: muestra progreso--load X%: máximo nivel de carga de la CPU antes de lanzar otro proceso--memfree XG: mínimo de memoria libre antes de lanzar otro proceso--dry-run: simulación de ejecución--eta: tiempo estimado de finalización basado en los ya ejecutados--joblog: crea un archivo de registro. Permite continuar el trabajo si se acabó inesperadamente.
parámetros argumentos
{}: comodín{.}: nombre archivo sin extensión{/}: nombre de archivo sin ruta{//}: la ruta de la carpeta sin archivo{/:.}: nombre del archivo sin la ruta y sin extensión:::: lista de parámetros{#}: número de orden del proceso.
ejemplos
- compresión ficheros nii por separado:
parallel gzip {} ::: *.nii
#!/usr/bin/env bash time ls *.nii.gz | parallel -j 8 --progress "echo Procesando {}; sleep 3"
#!/usr/bin/env bash #Fitxer 1 per executar el FreeSurfer per les imatges estructurals T1 # directori d'entrada export SUBJECTS_INPUT_DIR=/media/analysis/usr/akaruk/ENIGMA/enigma_scz/project_81/execucio_freesurfer/input/ # on aniran els outputs, necessari mantenir nom per recon-all export SUBJECTS_DIR=/media/analysis/usr/akaruk/ENIGMA/enigma_scz/project_81/freesurfer_output/ # fitxer de subjectes export SUBJECTS=/media/analysis/usr/akaruk/ENIGMA/enigma_scz/project_53/informacio_participants/participants.txt time cat $SUBJECTS | parallel -j 4 --progress "recon-all -i ${SUBJECTS_INPUT_DIR}{}.nii.gz -s {} -all" exit 0 for CODE in $(cat /media/analysis/usr/akaruk/ENIGMA/enigma_scz/project_81/execusio_freesurfer//InputFreeSurfer1.txt); do recon-all -i /media/analysis/usr/akaruk/ENIGMA/enigma_scz/project_81/execusio_freesurfer/input//$CODE.nii.gz -s $CODE -all done
#!/usr/bin/env bash function retallaPath() { # 1. Extraemos el nombre del archivo eliminando la ruta local nombre="${1##*/}" # 2. Eliminamos la extensión .zip y devolvemos el resultado echo "${nombre%.zip}" } function unzipMove() { PASSWORD_ZIP="Boo5eigh" fitxer=$(retallaPath $1) echo "Procesando $fitxer"; unzip -d ./tmp -o -P $PASSWORD_ZIP "$1" mv ./tmp/*.xls ./unZIPs/$fitxer.xls } export -f unzipMove retallaPath time ls ./ZIPs/*.zip | parallel -j 4 --progress "unzipMove {}" exit 0 time for f in ./ZIPs/*.zip; do fitxer=$(retallaPath $f) echo "Procesando $fitxer"; unzip -d ./tmp -o -P $PASSWORD_ZIP "$f" mv ./tmp/*.xls ./unZIPs/$fitxer.xls done
#!/usr/bin/env bash execucio_bianca() { local sujeto=$1 echo "Procesando $sujeto" # sleep .1 # treure!!! # exit # treure!!! bianca \ --singlefile=masterfile.txt \ --trainingnums=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 \ --labelfeaturenum=4 \ --querysubjectnum=${sujeto} \ --brainmaskfeaturenum=1 \ --featuresubset=1,2 \ --matfeaturenum=3 \ --trainingpts=2000 \ --nonlespts=10000 \ --selectpts=noborder \ -o resultados/s_${sujeto}_bianca_output \ -v > logs/sub_${sujeto}.log 2>&1 } mkdir -p resultados mkdir -p logs export -f execucio_bianca time parallel -j 16 --progress execucio_bianca {} ::: {21..315} # INICIO=21 # FIN=315 # time seq $INICIO $FIN | parallel -j 4 --progress "echo Procesando {}; sleep .5