Как распараллелить цикл без зависимости от данных для

#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, я уверен, что кто-нибудь также поможет. Это дает лучший контроль над палатализацией, например, запускает столько заданий, сколько у вас ядер процессора. Мой пример выше, не проверяющий такие вещи, просто запускает их все.

Итак, мой пример, как он есть, не является хорошим решением, если вы хотите запустить большое количество процессов одновременно.