Normalerweise arbeitet GNU Parallel wie das Programm xargs.
parallel holt sich die die Argumente (Dateinamen) von stdin, baut daraus Kommandozeilen zusammen und führt diese parallel aus. Dabei achtet parallel darauf, dass die Ausgabe – also das Ergebnis – dem eines sequenziellen Aufrufs entspricht.
Einführungsvideo
Die Beispiele und Man-Pages zu GNU Parallel stehen auf der Dokumentationsseite.
Neue Optionen mit parallel-20110205
Seit der Version 20110205 (siehe Ankündigung) kann GNU parallel noch mehr. Der Input muss nicht mehr in Einzeldateien vorhanden sein, sondern kann von parallel in Blöcke gesplittet werden.
cat bigfile | parallel --pipe --recend '' -k gzip -9 > bigfile.gz
In diesem Beispiel bekommen alle Instanzen von “gzip -9″ einen Teil des Inputs per stdin als pipe.
Wichtig ist hier der Parameter -k (–keeporder). Er stellt sicher, dass die Reihenfolge nicht verändert wird. parallel erzeugt temporäre Dateien in /tmp (Platz beachten oder –tmpdir verwenden).
–pipe
–pipe zerlegt den Input (von parallel) in Blöcke. Jeder Block wird einem Programm zur Weiterverarbeitung übergeben. Piping und Ausführung der Programme erfolgen parallel.
–blocksize
–blocksize setzt die Blockgrösse in bytes für –pipe. Die Blockgrösse kann variieren. Default ist 1M. Abkürzungen wie K, M, G, T dürfen verwendet werden.
–recstart
–recstart setzt den Startstring für einen Record. Default ist ” (ein Leerstring).
–recend
–recend setzt den String für das Ende eines Records. Default ist “\n”. Wenn kein Enderecord verwendet werden soll, ist –recend ” (Leerstring) anzugeben.
Wenn sowohl –recstart als auch –recend angegeben werden, muß der Enderecord direkt auf einen Startrecord folgen, damit er nicht ignoriert wird. Dies ist Sinnvoll, wenn Start- oder Endrecord in den Daten vorkommen können.
–remove-rec-sep
–remove-rec-sep entfernt die Recordseparatoren (recend und recstart).
–regexp
–regexp weisst GNU Parallel an, –recstart und –recend als Regular Expression zu behandeln.
–output-as-files
–output-as-files erzeugt für jeden Aufruf eine Datei mit dem Ergebnis und gibt die Dateinamen aus.
Beispiel:
( cd; tar cf - . ) | parallel --pipe --block-size 100m --verbose --recend '' -k --output-as-files 'gzip -9' > /tmp/t cat /tmp/t | parallel -k cat > /tmp/t.tgz # Einzeldateien zu einer Datei zusammenfassen rm `cat /tmp/t` # Einzeldateien löschen rm /tmp/t # Dateiliste löschen /tmp/t: /tmp/Xwx38x8YFS.par /tmp/ZfIAI56nDM.par /tmp/NAAkwg3DgC.par
Die Dateien bleiben stehen und werden nicht gelöscht.
-N
-N wird zusammen mit –pipe verwendet und setzt die Anzahl der zu verarbeitenden Records. -N ist langsamer als –blocksize und sollte nur in Ausnahmefällen verwendet werden.
Installation
parallel ist ein Perl-Script. Es lässt sich leicht installieren.
wget http://ftp.gnu.org/gnu/parallel/parallel-20110205.tar.bz2
bunzip2 < parallel-*.tar.bz2 | tar xvf -
cd parallel-20110205./configure && make && sudo make install
Parallel liegt nach der Installation in /usr/local/bin/parallel.
Beispiele
> parallel convert {} {.}_small.jpg ::: *.jpg
{} ist die Eingangsdatei (*.jpg)
{.} ist die Datei ohne Extension, an die dann _small.jpg angehängt wird
::: trennt die Kommandozeile von den Daten (Hier: *.jpg)
Links
- I still know what you Learned last Summer
- GNU parallel
- xargs kennt auch den Parameter -P, aber GNU Parallel ist mächtiger
Im Jahre 1924 sah Multiprocessor Computing noch etwas anders aus als heute.
Hier berechnen Angestellte die Bonuszahlungen für Veteranen in Washington DC.





