= 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ú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