2016-04-02 13 views
1

Ich habe ein Programm, das 3 Argumente -t, -a nimmt und es - beispielsweiseGnu Parallel mit mehreren Argumenten - Selektives Befehlsausführung

./Run -t 1500 -a 150000 -s filename 

Dieses Programm wird die Daten als eine Reihe append (von 7 Spalten) bis zum Ende der Datei "Dateiname".

Ich möchte untersuchen, wie diese beiden Parameter meine Ausgabe für Bereiche t in (1500, 150000 [Schritte von 5000]) und a in (500,600000 [Schritte von 500]) beeinflussen. Ab jetzt, was ich tue, ist, tue kann

parallel -j+0 ./Run -t {2} -a {1} :::: <(seq 500 500 600000) :::: <seq(1500 5000 15000) 

als der Parameter t für jeden Wert des Parameters durch seinen Bereich zu sehen ist eine überstrichen wird. Dadurch werden alle Daten in der Datei ausgegeben.

Aber für die Benutzerfreundlichkeit der Daten möchte ich 2 leere Zeilen zu der Datei hinzufügen, nachdem jeder Parameter a vollständig ausgewertet wurde, so kann ich mit meiner Verarbeitung fortfahren. Dies bedeutet, dass ich jedes Mal, wenn der Parameter a aktualisiert wird,

hinzufügen sollte.

Wie mache ich das mit gnu parallel?

+0

"Dieses Programm wird Daten als eine Reihe (von 7 Spalten) an das Ende der Datei" Dateiname "anhängen." Was passiert, wenn 2 Programme genau zur gleichen Zeit anhängen? –

Antwort

1

ich auf die gleiche Datei finden anhängen parallel beängstigend: Es gibt bestimmte Situationen, in denen es sicher zu tun, aber es gibt sooo viele Situationen, in denen es nicht sicher ist:

# Generate files with a single very long line 
parallel -j0 perl -e '\$a=\"1{}\"x10000000\;print\ \$a,\"\\n\"' '>' {} ::: {a..z} 
rm -f out.par 
# Grep for the single line in parallel - append to same file 
parallel -j0 'grep 1 >> out.par' ::: {a..z} 
# This ought to only give a single line for each letter 
# But because of race condition some lines are split into two 
parallel --tag 'grep {} out.par | wc -l' ::: {a..z} 
rm out.par 
# Do the same in serial (no race condition) 
parallel -j1 'grep 1 >> out.par' ::: {a..z} 
# Only a single line per letter 
parallel --tag 'grep {} out.par | wc -l' ::: {a..z} 
# Do the same in parallel but with serialized output (no race condition) 
parallel -j0 grep 1 ::: {a..z} > out.par 
# Only a single line per letter 
parallel --tag 'grep {} out.par | wc -l' ::: {a..z} 

Also, wenn ich Sie wäre, ich würde zuerst ./Run die Ausgabe auf stdout (Standardausgabe) ändern, so können Sie dies tun:

./Run -t 1500 -2 500 > filename 
# And in parallel: 
parallel ./Run -t {2} -2 {1} :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename 

um Ihre ursprüngliche Frage, die wir zustimmen müssen zu lösen, dass Ordnung nicht egal: Es ist nicht akzeptabel, wenn die Jobs ausgegeben völlig zufällige Reihenfolge. Deshalb brauchen wir --keep-order (-k).

parallel -k ./Run -t {2} -2 {1} :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename 

Jetzt müssen wir nur etwas, das nur dann läuft, wenn der erste Parameter 11500:

parallel -k './Run -t {2} -2 {1}; if [ {2} -eq 11500 ]; then echo "";fi' :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename 

Ich bin nicht sicher, was Sie es brauchen für, aber Sie vielleicht einen Blick auf nehmen möchten --tag als das könnte für Sie nützlich sein.

Verwandte Themen