2017-11-20 4 views
0

Ist dies der richtige Weg, um einen Java-Job mit der Eingabe myFile.txt auszuführen? Ich möchte das MyJavaClass-Programm mit der in args [0] angegebenen Eingabe ausführen, möchte dies jedoch lokal auf meinem Computer auf mehreren Kernen statt auf einem Cluster ausführen.Ausführen von GNU Parallel Java Job

parallel java MyJavaClass ::: myFile.txt 

EDIT:

Was ich erreichen will ist folgendes:

java MyJavaClass arg1 arg2 arg3 
java MyJavaClass arg4 arg5 arg6 
java MyJavaClass arg7 arg8 arg9 

und ich würde diese Jobs gerne parallel

+0

Möchten Sie N Kopien desselben Jobs parallel ausführen, wobei N die Anzahl der Kerne in Ihrer CPU ist? Wenn ja, ja. –

+0

Können Sie drei Beispiele für Befehle angeben, die von GNU Parallel ausgeführt werden sollen? Es macht es einfacher zu verstehen, was Sie erreichen möchten. –

+0

Was ich versuche zu tun ist, 10 Kopien des gleichen Jobs mit verschiedenen Eingaben parallel zu laufen, so würde ich gerne MyJavaClass mit myFile1, myFile2, ...., myFile10 als Eingabe parallel ausführen – Alk

Antwort

1

Wenn Sie myFile.txt mit Millionen von Zeilen, und Sie wollen diese Aufspaltung in einen Chunk pro CPU-Kern, und dann MyJavaClass an diesem Eingang laufen, und wir gehen davon aus, dass MyJavaClass lesen

cat chunk1 | java MyJavaClass > output1 
cat chunk2 | java MyJavaClass > output2 
cat chunk3 | java MyJavaClass > output3 

dann sieht es aus wie diese mit GNU Parallel:

0 von stdin (Standardeingabe) und druckt auf stdout (Standardausgabe), so dass die drei Zeilen wie folgt aussehen würde

Wenn MyJavaClass stattdessen einen Dateinamen nimmt so die 3 Zeilen wie folgt aussehen:

java MyJavaClass chunk1 > output1 
java MyJavaClass chunk2 > output2 
java MyJavaClass chunk3 > output3 

dann kann diese Arbeit:

# --fifo is fast, but may not work if MyJavaClass seeks into the file 
parallel -a myFile.txt --pipepart --fifo --block -1 java MyJavaClass {} > combined_output 
# --cat creates temporary files 
parallel -a myFile.txt --pipepart --cat --block -1 java MyJavaClass {} > combined_output 

Wenn MyJavaClass Ausgänge auf einen Dateinamen, so dass die drei Zeilen wie folgt aussehen Diese

java MyJavaClass chunk1 --output-file chunk1.output 
java MyJavaClass chunk2 --output-file chunk2.output 
java MyJavaClass chunk3 --output-file chunk3.output 

können Sie dann verwenden Sie {#} ist die Jobnummer und ist daher eindeutig:

1
parallel java MyJavaClass ::: myFile.txt 

laufen laufen:

java MyJavaClass myFile.txt 

Während:

parallel java MyJavaClass ::: myFile1.txt myFile2.txt 

werden diese parallel laufen:

java MyJavaClass myFile1.txt 
java MyJavaClass myFile2.txt 
1

Wenn die Datei myargs enthält:

arg1 
arg2 
arg3 
arg4 
arg5 
arg6 
arg7 
arg8 
arg9 

und Sie ausführen möchten:

java MyJavaClass arg1 arg2 arg3 
java MyJavaClass arg4 arg5 arg6 
java MyJavaClass arg7 arg8 arg9 

dann können Sie tun:

parallel -N3 java MyJavaClass :::: myargs 
+0

und was, wenn ich möchte, dass jeder dieser Jobs auf nur einem Kern ausgeführt wird, so dass wir insgesamt drei Kerne im obigen Beispiel haben, anstatt jeden dieser Jobs auf die verschiedenen Kerne aufzuteilen? – Alk