Я оцениваю, если GNU Parallel может использоваться для поиска файлов, хранящихся в системе, параллельно. В каждый день года может быть только один файл (doy) (так что максимум 366 файлов в год). Допустим, в системе имеется 3660 файлов (около 10 лет). Системой может быть многопроцессорный многоядерный Linux или многопроцессорный Solaris.Как подать большой массив команд GNU Parallel?
Я сохраняю команды поиска для работы с файлами в массиве (по одной команде для каждого файла). И это то, что я делаю прямо сейчас (используя Баш), но тогда я не имею никакого контроля на сколько поисков, чтобы начать параллельно (определенно не хочу, чтобы начать все 3660 поисков сразу):
#!/usr/bin/env bash
declare -a cmds
declare -i cmd_ctr=0
while [[ <condition> ]]; do
if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then
cmds[$cmd_ctr]="<cmd_to_run>"
let cmd_ctr++
fi
done
declare -i arr_len=${#cmds[@]}
for ((i=0; i<${arr_len}; i++));
do
# Get the command and run it in background
eval ${cmds[$i]} &
done
wait
Если бы я использовал parallel
(который автоматически определит максимальные ЦП/ядра и начнет только так много поисков параллельно), как я могу повторно использовать массив cmds
с параллельным и переписать вышеприведенный код? Другой альтернативой является запись всех команд в файл, а затем сделать cat cmd_file | parallel
Чтобы быть педантичным, в моей вселенной 10 лет не могут дать 3660 файлов, так как не может быть 10 последовательных високосных годов. Но так как вы написали «о», я полагаю, вы знаете это и не смотрите в меня из параллельной вселенной (что меня немного огорчает) ;-) –
@Adrian Вы правы; Я добавил 'about' для учета високосных лет :) –