Gnu并行多个参数 - 选择性命令执行

时间:2016-04-02 10:11:36

标签: linux file parallel-processing gnu

我有一个程序需要3个参数-t,-a和-s - 例如,

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

该程序将数据作为一行(7列)附加到文件“filename”的末尾。

我想研究这两个参数如何影响范围t in(1500,150000 [步长为5000])和in(500,600000 [步长为500])的输出。截至目前我正在做的是,

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

可以看出,对于参数a的每个值,参数t扫过其范围。这样就可以将所有数据打印到文件中了。

但是为了便于使用数据,我希望它在每个参数a完全评估后在文件中添加2个空行,这样我就可以继续进行处理了。这意味着我应该添加

echo "" >> filename

每次更新参数a时。

如何使用gnu parallel执行此操作?

1 个答案:

答案 0 :(得分:1)

我发现并行可怕地追加到同一个文件中:在某些情况下可以安全地进行,但是有很多情况下它不安全:

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

所以,如果我是你,我会先将./Run更改为输出到标准输出(标准输出),这样你就可以:

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

要解决您原来的问题,我们需要同意,订单确实很重要:如果作业以完全随机的顺序输出,那是不可接受的。因此,我们需要--keep-order( - k)。

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

现在我们只需要制作只在第一个参数为11500时运行的东西:

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

我不确定您需要它,但您可能需要查看--tag,因为这可能对您有用。