Как конвертировать цикл в несколько рабочих мест? - PullRequest
0 голосов
/ 15 мая 2019

Я отправляю задание в кластер, используя qsub SubmitJob.sh. Это работает хорошо, но занимает много времени, чтобы закончить. Внутри SubmitJob.sh есть цикл for, который выполняется последовательно. Я хотел бы преобразовать цикл for для параллельной отправки задания, чтобы каждый из них отправлял одну работу (SubmitJob.sh).

#!/bin/bash
#$ -S /bin/bash
#$ -V -cwd
#$ -e ./error.$JOB_NAME.$JOB_ID
#$ -o ./outpt.$JOB_NAME.$JOB_ID
#$ -l h_vmem=256g
##$ -q long
##$ -pe smp 4
#$ -l h_rt=24:00:00


cd /mydirectroy/

for ID in $(cat FilID.txt) ; do

Do_Somthing -n $ID  -o /OutputDirectory/$ID

done

1 Ответ

0 голосов
/ 16 мая 2019

Я должен был сделать что-то подобное один или два раза. Общая идея заключается в том, что вы предоставляете части массива в качестве ссылки на функцию и выполняете ее как дочерние процессы. Я решил использовать квадратный корень в качестве делителя, потому что рабочая нагрузка будет расти линейно по отношению к количеству элементов для обработки.

#! /bin/bash

FILE="FilID.txt"
DATA=($(cat ${FILE}))
AMOUNT=${#DATA[@]}
RANGE=$(echo "sqrt(${AMOUNT})" | bc)

echo ${amount}
echo $range

function _child {
        local -n numbers=$1
        echo "From ${numbers[0]} to ${numbers[-1]}"
        for n in ${numbers[@]}; do echo -n "$n, "; done
        echo 
}

for ((i=0; i<AMOUNT; i+=RANGE)) {
        part=(${DATA[@]:$i:$RANGE})
        _child part &
        # wait
}

wait
exit 0

Вы можете проверить скрипт, заполнив FilID.txt следующим образом. Раскомментируйте wait в цикле for для удобочитаемого вывода.

$ seq 0 98 > FilID.txt

Возможно, вы захотите дождаться завершения всех N дочерних процессов, прежде чем запускать следующий пакет. Когда я выполнял скрипт, нагрузка стала слишком высокой, и Linux решил убить нашу виртуальную среду разработки: p

P.S. если FilID.txt содержит пробелы с именами файлов, вы должны установить IFS=$'\n' или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...