Запуск оболочки script параллельно
У меня есть оболочка script, которая
- перетаскивает большой текстовый файл (6 миллионов строк и 6 столбцов)
- сортирует файл на основе первого столбца
- выводит 1000 файлов
Итак, псевдокод выглядит так:
file1.sh
#!/bin/bash
for i in $(seq 1 1000)
do
Generating random numbers here , sorting and outputting to file$i.txt
done
Есть ли способ запустить эту оболочку script в parallel
, чтобы в полной мере использовать многоядерные процессоры?
В настоящий момент /file1.sh
выполняется в последовательности от 1 до 1000 прогонов, и это очень медленно.
Спасибо за вашу помощь.
Ответы
Ответ 1
Обратите внимание на bash subshells, они могут использоваться для параллельной работы частей script.
Я не тестировал это, но это может быть началом:
#!/bin/bash
for i in $(seq 1 1000)
do
( Generating random numbers here , sorting and outputting to file$i.txt ) &
if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait
Ответ 2
Еще один очень удобный способ сделать это: gnu parallel, который стоит установить, если у вас его еще нет; это неоценимо, если задачи не обязательно занимают одинаковое количество времени.
seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}
запустит ./myrun 1
, ./myrun 2
и т.д., убедившись, что запущено 8 заданий за раз. Он также может принимать списки узлов, если вы хотите запускать сразу несколько узлов, например, в задании PBS; наши инструкции для наших пользователей, как это сделать в нашей системе, здесь.
Обновлено для добавления:. Вы хотите убедиться, что используете gnu-parallel, а не более ограниченную утилиту с тем же именем, что и в пакете moreutils (расходящаяся история этих двух описанный здесь.)
Ответ 3
Чтобы все работало параллельно, вы используете '&' в конце команды оболочки для ее запуска в фоновом режиме, тогда wait
будет по умолчанию (т.е. без аргументов) дождитесь завершения всех фоновых процессов. Итак, возможно, начните 10 параллельно, затем подождите, а затем выполните еще десять. Вы можете сделать это легко с помощью двух вложенных циклов.
Ответ 4
Существует весь список программ, который может запускать задания параллельно с оболочкой, которая даже включает сравнения между ними, в документации для GNU параллельна. Там много и много решений. Еще одна хорошая новость заключается в том, что они, вероятно, достаточно эффективны при планировании заданий, так что все ядра/процессоры постоянно заняты.
Ответ 5
Существует простая, переносимая программа, которая делает именно это для вас: PPSS. PPSS автоматически назначает вам задания, проверяя, сколько ядер доступно, и запускает другое задание каждый раз, когда другой только что закончил.
Ответ 6
IDLE_CPU=1
NCPU=$(nproc)
int_childs() {
trap - INT
while IFS=$'\n' read -r pid; do
kill -s SIGINT -$pid
done < <(jobs -p -r)
kill -s SIGINT -$$
}
# cmds is array that hold commands
# the complex thing is display which will handle all cmd output
# and serialized it correctly
trap int_childs INT
{
exec 2>&1
set -m
if [ $NCPU -gt $IDLE_CPU ]; then
for cmd in "${cmds[@]}"; do
$cmd &
while [ $(jobs -pr |wc -l) -ge $((NCPU - IDLE_CPU)) ]; do
wait -n
done
done
wait
else
for cmd in "${cmds[@]}"; do
$cmd
done
fi
} | display
Ответ 7
sleep 5 &
sleep 6 &
wait
echo "only 6 seconds to reach here"
Ответ 8
генерирование случайных чисел легко.
предположим, что у вас есть огромный файл, такой как база данных магазина, и вы хотите переписать этот файл на определенной основе.
Моя идея состояла в том, чтобы вычислить количество ядер, разделить файл на сколько ядер, сделать script.cfg файл, split.sh и recombine.sh
split.sh будет разбивать файл на сколько ядер, клонировать script.cfg(script, который изменяет материал в этих огромных файлах), clone script.cgf в том, сколько ядер, сделать их исполняемыми, искать и заменять в клонах некоторые переменные, которые должны знать, какую часть файла обрабатывать
и запускать их в фоновом режиме
когда выполняется клонирование, генерирует файл clone $core.ok, поэтому, когда все клоны будут выполнены, он будет указывать циклу для рекомбинации частичных результатов в один только при создании всех файлов .ok.
это может быть сделано с "wait", но мне нравится мой путь
http://www.linux-romania.com/product.php?id_product=76
посмотрите на дно, частично переводится в EN
таким образом, я могу получить 20000 статей с 16 столбцами за 2 минуты (четырехъядерный процессор) вместо 8 (одноядерный)
Вы должны заботиться о температуре процессора, поскольку все ядра работают на 100%