【问题标题】:For loop in parallel并行循环
【发布时间】:2018-11-27 19:02:42
【问题描述】:

有没有一种快速、简单、高效的方式在这个 for 循环中并行运行迭代?

for i in `seq 1 5000`; do
  repid="$(printf "%05d" "$i")"
  inp="${repid}.inp"
  out="${repid}.out"
  /command "$inp" "$out"
done

【问题讨论】:

  • 只需将& 放在/command 行之后。不过,您确定您的系统可以处理 5000 个进程实例吗?
  • 我不想同时运行所有 5000 个实例,因为那是不可能的。我正在考虑如何,例如在 R 中,某些包可以使用套接字或分叉 (r-bloggers.com/parallel-r-loops-for-windows-and-linux) 在循环中处理令人尴尬的并行工作负载。 bash 中有这样的东西吗?
  • xargs -PGNU parallel

标签: bash parallel-processing


【解决方案1】:

如果您想充分利用您花大价钱购买英特尔的所有可爱 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

【讨论】:

  • echo {00001..050000000} |parallel -d" " 'echo command {}.inp {}.out'
【解决方案2】:
for i in `seq 1 5000`; do
  repid="$(printf "%05d" "$i")"
  inp="${repid}.inp"
  out="${repid}.out"
  /command "$inp" "$out" &
done

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 2012-12-09
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多