Для параллельного цикла - PullRequest
0 голосов
/ 27 ноября 2018

Существует ли быстрый, простой и эффективный способ выполнения итераций в этом цикле for параллельно?

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

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Если вы хотите воспользоваться всеми своими прекрасными ядрами ЦП, за которые вы так щедро заплатили Intel, перейдите на GNU Parallel :

seq -f "%05g" 5000 | parallel -k echo command {}.inp {}.out

Если вам нравится внешний вид этого, запустите его снова без -k (который сохраняет вывод в порядке) и без echo.Вам может потребоваться заключить команду в одинарные кавычки:

seq -f "%05g" 5000 | parallel '/command {}.inp {}.out'

Она будет запускать 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

и он подскажет, скольков байтах ваш список параметров может быть.Вам понадобится 5000 номеров по 5 цифр плюс пробел каждое, поэтому минимум 30 000.


Если вы используете macOS , вы можете установить GNU Parallel с домашним пивом :

brew install parallel
0 голосов
/ 27 ноября 2018
for i in `seq 1 5000`; do
  repid="$(printf "%05d" "$i")"
  inp="${repid}.inp"
  out="${repid}.out"
  /command "$inp" "$out" &
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...