2013-08-22 20 views
9

To jest mój skrypt:Jak korzystać z programowania równoległego/wielowątkowości w moim skrypcie 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 

Tutaj istnieje około 30 podkatalogów w katalogu „źródła”. Każdy podkatalog ma pewne pliki: R1 .fastq.gz i R2 .fastq.gz, które chcę scalić w jeden plik R1.fastq.gz i R2.fastq.gz, a następnie zapisać scalony plik do miejsca docelowego informator. Mój kod działa dobrze, ale muszę go przyspieszyć ze względu na ilość danych. Po prostu chcę wiedzieć, czy istnieje sposób, w jaki mogę zaimplementować programowanie wielowątkowe w moim skrypcie? Jak mogę uruchomić mój skrypt, aby wiele zadań działało równolegle? Nowość w bashowaniu skryptów, więc każda pomoc będzie doceniana.

+0

Ponieważ wyraźnie zajmujesz się bioinformatyką, powinieneś przeczytać: http://www.biostars.org/p/81359/ http://www.biostars.org/p/63816/ –

Odpowiedz

7

Najprostszym sposobem jest wykonanie polecenia w tle, dodając & na końcu polecenia :

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

z bash manual:

Jeżeli polecenie jest zakończone przez operatora kontrolnego "&", powłoka wykonuje polecenie asynchronicznie w podpowłoce. Jest to znane jako wykonywanie polecenia w tle. Powłoka nie czeka na zakończenie polecenia, a status powrotu to 0 (prawda). Kiedy kontrola zadań nie jest aktywna (patrz Kontrola zadań), standardowe wejście dla poleceń asynchronicznych, w przypadku braku wyraźnych przekierowań, jest przekierowywane z/dev/null.

+0

Właściwie to miałem na myśli na inne pytania dotyczące stackoverflow dotyczące tego i wspominają coś takiego jak pid i czekać i coś w tym stylu. Czy dodanie i na końcu polecenia jest skutecznym sposobem zrównoleglania twoich zadań? –

+1

@ user2703967 yes ... dodanie '&' spawnuje nową podpowłokę, która po prostu znika i działa podczas gdy twój skrypt jest kontynuowany. Jeśli potrzebujesz czegoś bardziej wyrafinowanego, prawdopodobnie nie powinieneś używać basha w pierwszej kolejności. –

+0

Dzięki, ostatnie pytanie. Kiedy używam "wait" po "done", co to za różnica? –

3

Nie jestem pewien, ale można spróbować użyć & na końcu polecenia jak ten

zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz & 
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz & 
Powiązane problemy