Ich verwende GNU parallel, um BAM-Dateien zu verarbeiten und Duplikate mit dem Java-basierten Picard-Tool zu markieren. Der Grund für die Verwendung des parallelen Dienstprogramms ist, dass das Picard-Tool nicht multithreadfähig ist und der Datensatz sehr groß ist. Daher verwende ich den folgenden Befehl mit GNU parallel:
ls *.bam | sed 's/.bam.*//' | parallel --eta -j 12 "java -jar picard.jar MarkDuplicates I={}.bam O=/bam1/{}.bam M=/bam1/{}_dup_matrices.txt"
Erwartung Da mein Server über 40 Threads und 126 GB RAM verfügt, hoffte ich, dass der obige Befehl alle im aktuellen Verzeichnis vorhandenen BAM-Dateien verarbeitet und dabei jeweils 12 BAM-Dateien verarbeitet.
Tatsächliche Ausgabe
Am Ende erhalte ich nur 4 oder 5 verarbeitete BAM-Dateien, während das aktuelle Verzeichnis etwa 15 BAM-Dateien enthält. Außerdem erhalte ich einen Speicherüberlauffehler (obwohl ich die Speicherzuweisung mit dem Befehl überprüft habe ulimit
und sie „unbegrenzt“ anzeigt).
Ist es möglich, das GNU-Paralleldienstprogramm so zu verwenden, dass es alle im aktuellen Verzeichnis vorhandenen Dateien automatisch und ohne Speicherprobleme verarbeitet?
EDIT-1: Ich füge die Ausgabe ulimit -a
hier hinzu:
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
Antwort1
java
reserviert oft viel mehr Speicher, als es verwendet. 10x ist nicht ungewöhnlich. Wenn wir also davon ausgehen, dass picard
tatsächlich 3 GB verwendet werden, aber 30 GB reserviert werden, können Sie nur 4 Jobs parallel ausführen, bevor Ihnen der Speicher ausgeht – es sei denn, Sie fügen Swapspace hinzu.
Nur weil java
der Speicher reserviert wird, heißt das nicht, dass er jemals darauf zugreift.
Mein Vorschlag ist, dass Sie 1 TB Swapspace hinzufügen.
Sie können den Linux-Kernel auch bitten, den Speicher zu überlasten. Ich habe dabei jedoch schlechte Erfahrungen mit unerwarteten Serverabstürzen gemacht, daher rate ich von dieser Lösung ab.
Aber dudürfenVerwenden Sie zswap. Wenn auf diese Weise etwas in den Swap geschrieben wird, versucht der Kernel zunächst, es zu komprimieren und im RAM zu behalten. Nur wenn dies nicht gelingt, wird der Speicher auf die Festplatte geschrieben. In Kombination mit dem 1 TB (langsamen) Swap-Speicher auf der Festplatte funktioniert dies recht effizient.