2013-08-22 3 views
9

Это мой сценарий:Как использовать параллельное программирование/многопоточность в моем сценарии bash?

#!/bin/bash 
#script to loop through directories to merge fastq files 
sourcedir=/path/to/source 
destdir=/path/to/dest 

for f in $sourcedir/* 
do 
    fbase=$(basename "$f") 
    echo "Inside $fbase" 
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz 
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz 
done 

Здесь около 30 подкаталогов в «источнике» каталога. Каждая подкаталог имеет определенные файлы R1 .fastq.gz и R2 .fastq.gz, которые я хочу объединить в один файл R1.fastq.gz и R2.fastq.gz, а затем сохранить объединенный файл в пункт назначения каталог. Мой код работает отлично, но мне нужно ускорить его из-за объема данных. Я просто хочу знать, есть ли способ реализовать многопоточное программирование в моем скрипте? Как запустить мой скрипт так, чтобы параллельно выполнялось несколько заданий? Новое для сценариев bash, поэтому любая помощь будет оценена по достоинству.

+0

Поскольку вы явно имеем дело с биоинформатики вы должны прочитать эти: http://www.biostars.org/p/81359/ http://www.biostars.org/p/63816/ –

ответ

7

Самый простой способ для выполнения команд в фоновом режиме, добавляя & в конце команды :

#!/bin/bash 
#script to loop through directories to merge fastq files 
sourcedir=/path/to/source 
destdir=/path/to/dest 

for f in $sourcedir/* 
do 
    fbase=$(basename "$f") 
    echo "Inside $fbase" 
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz & 
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz & 
done 

bash manual Из:

Если команда завершенный оператором управления «&», оболочка выполняет асинхронную команду в подоболочке. Это называется выполнением команды в фоновом режиме. Оболочка не ждет завершения команды, а статус возврата равен 0 (true). Когда управление заданием не активно (см. «Управление заданиями»), стандартный ввод для асинхронных команд при отсутствии явных перенаправлений перенаправляется из/dev/null.

+0

Я был на самом деле в виду к другим вопросам stackoverflow, касающимся этого, и они упоминают что-то вроде pid и ждать и что-то вроде этого. Итак, добавление & в конце команды является эффективным способом распараллеливания ваших заданий? –

+1

@ user2703967 yes ... добавление '&' порождает новую подоболочку, которая просто уходит и делает свое дело, пока ваш скрипт продолжается. Если вам нужно что-то более сложное, вы, вероятно, не должны использовать bash в первую очередь. –

+0

Спасибо, последний вопрос. Когда я использую «wait» после «done», какая разница? –

3

Я не уверен, но вы можете попробовать использовать & в конце команды, как этот

zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz & 
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz & 
Смежные вопросы