是否有一种快速、简单且高效的方法来并行运行此 for 循环中的迭代?
for i in `seq 1 5000`; do
repid="$(printf "%05d" "$i")"
inp="${repid}.inp"
out="${repid}.out"
/command "$inp" "$out"
done
最佳答案
如果您想利用您向英特尔支付了巨额费用的所有可爱的 CPU 内核,请转向 GNU Parallel:
seq -f "%05g" 5000 | parallel -k echo command {}.inp {}.out
如果您喜欢它的外观,请再次运行它,不要使用 -k
(这会保持输出的顺序)并且不要使用 echo
。您可能需要将命令括在单引号中:
seq -f "%05g" 5000 | parallel '/command {}.inp {}.out'
它将并行运行每个 CPU 核心 1 个实例,但是,如果您想并行运行 32 个实例,请使用:
seq ... | parallel -j 32 ...
如果您想要“预计到达时间”,请使用:
parallel --eta ...
如果您想要进度表,请使用:
parallel --progress ...
如果您有 bash 4+ 版本,它可以用零填充大括号扩展。如果您的 ARGMAX
足够大,那么您可以更简单地使用:
parallel 'echo command {}.inp {}.out' ::: {00001..05000}
您可以通过以下方式检查您的ARGMAX
:
sysctl -a kern.argmax
它告诉您参数列表可以有多少字节长。您将需要 5,000 个 5 位数字,每个数字加一个空格,因此最少 30,000 个。
如果您使用的是 macOS,则可以使用 homebrew 安装 GNU Parallel:
brew install parallel
关于bash - 并行 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53506468/