这是使用输入myFile.txt执行Java作业的正确方法吗?我想做的是在输入args [0]的情况下运行MyJavaClass程序,但是,我想在多个内核而不是集群上的本地机器上运行此程序。

parallel java MyJavaClass ::: myFile.txt


编辑:

我要完成的工作如下:

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


我希望这些作业可以并行运行

最佳答案

如果您有myFile.txt包含数百万行的行,并且希望将其拆分为每个CPU内核一个块,然后在该输入上运行MyJavaClass,则假定MyJavaClass从标准输入(标准输入)中读取并打印到stdout(标准输出),因此3行看起来像这样:

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


然后使用GNU Parallel看起来像这样:

parallel -a myFile.txt --pipepart --block -1 java MyJavaClass > combined_output


如果MyJavaClass改用文件名,则3行如下所示:

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


那么这可能工作:

# --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


如果MyJavaClass输出到文件名,则三行如下所示

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


然后,您可以使用{#}是作业编号,因此是唯一的:

parallel [...] java MyJavaClass {} --output-file {#}.output

07-26 09:11