对于并行循环

时间:2018-11-27 19:02:42

标签: 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

2 个答案:

答案 0 :(得分:2)

如果您想利用自己花了这么大价钱向英特尔支付的所有可爱的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

答案 1 :(得分:1)

var container = document.createElement("div");
container.style.flex = "1 0 100%";
container.style.backgroundColor = "white";
container.style.display = "flex";
container.style.flexDirection = "column";
container.id = "container";