Я должен был сделать что-то подобное один или два раза. Общая идея заключается в том, что вы предоставляете части массива в качестве ссылки на функцию и выполняете ее как дочерние процессы. Я решил использовать квадратный корень в качестве делителя, потому что рабочая нагрузка будет расти линейно по отношению к количеству элементов для обработки.
#! /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'
или что-то еще.