Запустите 4 одновременных экземпляра скрипта Python в папке с файлами данных. - PullRequest
5 голосов
/ 23 января 2012

У нас есть папка с 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 ]

7 голосов
/ 23 января 2012

Вы можете использовать multiprocessing -модуль. Я полагаю, у вас есть список файлов для обработки и функция для вызова каждого файла. Тогда вы можете просто использовать рабочий пул следующим образом:

from multiprocessing import Pool, cpu_count

pool = Pool(processes=cpu_count)
pool.map(process_function, file_list, chunksize=1)

Если ваш process_function не возвращает значение, вы можете просто проигнорировать возвращаемое значение.

1 голос
/ 23 января 2012

Сделайте снимок:

#!/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

1 голос
/ 23 января 2012

Взгляните на xargs. Это опция -P предлагает настраиваемую степень параллелизма. В частности, что-то вроде этого должно работать для вас:

ls files* | awk '{print $1,$1".out"}' | xargs -P 4 -n 2 python fastq_groom.py
0 голосов
/ 29 декабря 2014

Если у вас есть GNU Parallel, вы можете сделать:

parallel python fastq_groom.py {} {}.out ::: files*

Он будет делать правильные вещи, создавая работу для каждого ядра, даже если в именах ваших файлов есть пробел 'или'. Это также гарантирует, что выходные данные из разных заданий не будут смешаны вместе, так что если вы используйте вывод, который вам гарантирован, что вы не получите пол-строки от двух разных заданий.

GNU Parallel - это обычный параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh.

Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Simple scheduling

GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая активные процессоры и, таким образом, экономя время:

GNU Parallel scheduling

Установка

Если 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

...