Запустите 4 одновременных экземпляра скрипта Python в папке с файлами данных.
У нас есть папка с 50 файлами данных (последовательностями ДНК следующего поколения), которые необходимо преобразовать, запустив скрипт на каждом из них. Сценарий занимает 5 часов на файл, он однопоточный и в значительной степени связан с процессором (ядро процессора работает на 99% с минимальным дисковым вводом-выводом).
Поскольку у меня 4-х ядерная машина, я бы хотел запустить 4 экземпляра этого скрипта одновременно, чтобы значительно ускорить процесс.
Я думаю, что я мог бы разделить данные на 4 папки и запустить следующий скрипт bash для каждой папки одновременно:
files=`ls -1 *`
for $file in $files;
do
out = $file+=".out"
python fastq_groom.py $file $out
done
Но должен быть лучший способ запустить его в одной папке. Мы можем использовать Bash/Python/Perl/Windows для этого.
(К сожалению, создание многопоточного скрипта выходит за рамки того, что мы можем сделать)
Использование решения @phs xargs было для нас самым простым способом решения проблемы. Однако мы просим первоначального разработчика реализовать ответ @Björn. Еще раз спасибо!
4 ответа
Взгляни на xargs
, Это -P
опция предлагает настраиваемую степень параллелизма. В частности, что-то вроде этого должно работать для вас:
ls files* | awk '{print $1,$1".out"}' | xargs -P 4 -n 2 python fastq_groom.py
Вы можете использовать multiprocessing
-модуль. Я полагаю, у вас есть список файлов для обработки и функция для вызова каждого файла. Тогда вы можете просто использовать рабочий пул следующим образом:
from multiprocessing import Pool, cpu_count
pool = Pool(processes=cpu_count)
pool.map(process_function, file_list, chunksize=1)
Если твой process_function
не возвращает значение, вы можете просто проигнорировать возвращаемое значение.
Дайте этому шанс:
#!/bin/bash
files=( * )
for((i=0;i<${#files[@]};i+=4)); do
{
python fastq_groom.py "${files[$i]}" "${files[$i]}".out &
python fastq_groom.py "${files[$i+1]}" "${files[$i+1]}".out &
python fastq_groom.py "${files[$i+2]}" "${files[$i+2]}".out &
python fastq_groom.py "${files[$i+3]}" "${files[$i+3]}".out &
}
done
Следующее помещает все файлы в массив с именем files
, Затем он выполняет и обрабатывает четыре процесса Python для первых четырех файлов. Как только все четыре из этих процессов завершены, он выполняет следующие четыре. Это не так эффективно, как всегда поддерживать очередь из 4, но если все процессы занимают примерно одинаковое количество времени, это должно быть довольно близко к этому.
Кроме того, пожалуйста, пожалуйста, не используйте вывод ls
как это. Просто используйте стандартную глобализацию, как в for files in *.txt; do ...; done
Если у вас есть GNU Parallel, вы можете сделать:
parallel python fastq_groom.py {} {}.out ::: files*
Он будет работать правильно, порождая задание на ядро, даже если в именах ваших файлов есть пробел 'или'. Он также гарантирует, что выходные данные разных заданий не будут смешаны вместе, поэтому, если вы используете вывод вам гарантировано, что вы не будете получать половину от двух разных работ.
GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh.
Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:
GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая активные процессоры и, таким образом, экономя время:
Монтаж
Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку, которая не требует root-доступа. Это можно сделать за 10 секунд, выполнив это:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Для других вариантов установки см. http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Учить больше
Смотрите больше примеров: http://www.gnu.org/software/parallel/man.html
Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Просмотрите учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html
Подпишитесь на список рассылки, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel