GNU paralelo no procesa todos los archivos

GNU paralelo no procesa todos los archivos

Estoy usando GNU paralelo para procesar archivos BAM para marcar duplicados usando la herramienta Picard basada en Java. La razón para utilizar la utilidad paralela es que la herramienta picard no es multiproceso y el conjunto de datos es muy grande. Entonces estoy usando el siguiente comando con GNU paralelo:

ls *.bam | sed 's/.bam.*//' | parallel --eta -j 12 "java -jar picard.jar MarkDuplicates I={}.bam O=/bam1/{}.bam M=/bam1/{}_dup_matrices.txt"

Expectativa Dado que mi servidor tiene 40 subprocesos y 126 GB de RAM, esperaba que el comando anterior procesara todos los archivos bam presentes en el directorio actual mientras procesa 12 bam a la vez.

Salida real Al final, solo obtengo 4 o 5 archivos BAM procesados, mientras que el directorio actual tiene alrededor de 15 archivos BAM. También recibo un error de desbordamiento de memoria (aunque verifiqué la asignación de memoria usando el comando ulimity se muestra ilimitada).

¿Es posible utilizar la utilidad paralela GNU de manera que procese automáticamente todos los archivos presentes en el directorio actual sin problemas de memoria?

EDITAR-1: Estoy agregando el resultado de ulimit -aaquí:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 514974
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 514974
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Respuesta1

javaA menudo reserva mucha más memoria de la que utiliza. 10x no es infrecuente. Entonces, si asumimos que picarden realidad usa 3 GB, pero reserva 30 GB, entonces solo podrá ejecutar 4 trabajos en paralelo antes de quedarse sin memoria, a menos que agregue espacio de intercambio.

El hecho de que javareserve la memoria no significa que alguna vez la toque.

Mi sugerencia es que agregue 1 TB de espacio de intercambio.

También puede pedirle al kernel de Linux que comprometa en exceso la memoria. Pero tengo una mala experiencia con fallas inesperadas del servidor al hacer eso, por lo que no recomendaría esa solución.

Pero tupoderUtilice zswap. De esta manera, si se escribe algo para intercambiar, el kernel primero intentará comprimirlo y mantenerlo en la RAM. Sólo si no lo hace, la memoria se escribirá en el disco. Combinado con el espacio de intercambio de 1 TB (lento) en el disco, esto funciona de manera bastante eficiente.

información relacionada