#bash #gnu-parallel
#bash #gnu-parallel
Вопрос:
Я пытаюсь распараллелить этот цикл for. Я не смог выяснить, как ответы других людей заменяют $a
значение и потому что моя программа зависит от этого.
Вот исходный код, который я хочу распараллелить. cvp — это исполняемая программа Cpp. Цель этого скрипта — выполнить цикл от 0 до 29, используя file_0 до file_29 с pc_0 до pc_29 и от 0 до 29 в качестве аргументов, и сгенерировать выходной файл с именем от output_0 до output_29. Обратите внимание, что программа также требует много памяти, поэтому, если я могу просто распараллелить 4 (это количество ядра, которое у меня есть), это было бы здорово.
#!/bin/bash
#testing script
for a in {0..29}
do
set -x
./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_$a.gz >>output_$a pc_$a $a
done
Ответ №1:
Что-то вроде этого:
parallel --results output_{} ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_{}.gz pc_{} {} ::: {0..29}
или:
parallel ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_{}.gz pc_{} {} ">>" output_{} ::: {0..29}
Ответ №2:
Простая палатализация с помощью bash
Вы можете создать функцию и передать переменную $a
в качестве первого параметра и запустить ее в фоновом режиме amp;
, или вы можете просто поставить amp;
в конце вашей команды в цикле for, я предпочитаю функции.
Функция использует первый параметр $1
и делает то, что вам нравится при каждом ее вызове.
wait
будет ждать завершения всего фонового процесса, иначе сценарий может быть завершен до фоновых процессов.
#!/bin/bash
#testing script
myfunction () {
./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_${1}.gz >>output_${1} pc_${1} ${1}
}
for a in {0..29}
do
set -x
myfunction ${a} amp;
done
wait
Если вам нравится использовать gnu-parallel, я уверен, что кто-нибудь также поможет. Это дает лучший контроль над палатализацией, например, запускает столько заданий, сколько у вас ядер процессора. Мой пример выше, не проверяющий такие вещи, просто запускает их все.
Итак, мой пример, как он есть, не является хорошим решением, если вы хотите запустить большое количество процессов одновременно.