Подтвердить что ты не робот

Запуск оболочки 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 прогонов, и это очень медленно.

Спасибо за вашу помощь.

4b9b3361

Ответ 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%