bash - 并行 for 循环

标签 bash parallel-processing

是否有一种快速、简单且高效的方法来并行运行此 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 个。


如果您使用的是 ma​​cOS,则可以使用 homebrew 安装 GNU Parallel:

brew install parallel

关于bash - 并行 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53506468/

相关文章:

c# - 在 .NET 4.0 中将任务与 Parallel.Foreach 结合使用

bash - 仅打印其参数的函数是纯函数吗?

Linux:如何为保持扩展名的文件添加后缀

python - 如何使用 bash 脚本退出 Django 开发服务器?

linux - 列出按时间排序的文件 key 对

r - R 中的 furrr 包不会继续将工作分散到所有内核?

c++ - 多核编程/Mandelbrot Set/c++

c# - 在并行循环之间保留 ThreadLocal 是好还是坏?

linux - openssl sha1 长度

c# - 如何在ASP.NET中并行化CPU密集型操作