User Tools

Site Tools


gnu_parallel

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
gnu_parallel [2017/04/11 08:51]
hyjeong [GNU Parallel 활용 가이드]
gnu_parallel [2019/09/04 10:43] (current)
hyjeong [GNU Parallel 활용 가이드]
Line 6: Line 6:
   $ gzip *fastq   $ gzip *fastq
  
-만약 하부 디렉토리에 있는 fastq 파일까지 찾아서 압축하려면 find 명령어를 쓰면 된다. 그러나 어떤 경우이든,​ 파일을 순차적으로 하나씩 처리하므로 많은 시간이 걸리게 된다. GNU Parallel을 사용하면 작업할 파일을 여러 core로 보내서 동시에 일을 하게 만든다. 다음의 명령어로는 총 8개의 gzip job을 동시에(즉 parallele하게) 실행한다. 다시 말하자면 한번에 8개의 fastq 파일을 8개의 코어로 보내어 압축을 하게 만든다는 것이다. 이 사례에서는 파일을 잘게 자르지는 않는다(그것도 병력 작업의 한 방법이 된다).+만약 하부 디렉토리에 있는 fastq 파일까지 찾아서 압축하려면 find 명령어를 쓰면 된다. 그러나 어떤 경우이든,​ 파일을 순차적으로 하나씩 처리하므로 많은 시간이 걸리게 된다. GNU Parallel을 사용하면 작업할 파일을 여러 core로 보내서 동시에 일을 하게 만든다. 다음의 명령어로는 총 8개의 gzip job을 동시에(즉 parallele하게) 실행한다. 다시 말하자면 ​::: 뒤편의 인수 리스트에서 ​한번에 8개의 fastq 파일을 ​골라서(순서는 무작위적임) 이를 ​8개의 코어로 보내어 ​gzip 압축을 하게 만든다는 것이다. 이 사례에서는 파일을 잘게 자르지는 않는다(그것도 병렬 작업의 한 방법이 된다).
  
   $ parallel -j 8 gzip ::: *.fastq   $ parallel -j 8 gzip ::: *.fastq
 +
 +물론 이것은 극단적으로 단순한 활용 사례에 불과하다. 약간 고급스런 응용 사례를 생각해 보자. 현 디렉토리 아래에 존재하는 모든 fastq 파일을 찾아서 압축을 하려면 다음과 같이 한다.
 +
 +  $ find . -name "​*.fastq"​ | parallel gzip
 +  $ parallel -a fasta_files_fof gzip (압축할 파일 목록이 있는 경우)
 +  $ parallel -a gzipped_fasta_files_fof gzip -d (압축을 해제할 파일 목록이 있는 경우)
 +
 +결과 파일을 구조적으로 잘 저장한다든가,​ 실행 순서를 지정한다든가,​ command line을 정교하게 짜려면 매뉴얼을 보고 좀 더 공부를 해야 한다. GNU Parallel은 SSH로 연결된 remote server를 사용하게 만들 수도 있다. ​
 +
 +아주 초급 수준을 벗어난 활용 사례를 설명해 보겠다. 수십개의 염기서열 파일에 대해서 [[http://​emboss.sourceforge.net/​|EMBOSS]]의 restrict(report restriction enzyme cleavage sites in a nucleotide sequence)를 실행하고자 한다. 입력물로 택할 염기서열 파일명과 결과를 출력파일명은 각각 sourcelist와 destlist에 수록되었다고 가정하자. 동시에 8개의 job을 수행하려면 다음과 같이 명령하면 된다. {1}과 {2}의 순서만 잘 지킨다면 -sequence나 -outfile은 생략해도 된다. ​
 +
 +  $ parallel -a sourcelist -a destlist -j8 restrict -sitelen 4 -enzymes EcoRI,​BamHI,​HindIII -sequence {1} -outfile {2}
 +
 +**만약 어떤 파일에 완벽한 상태의 command가 여러 줄 들어있고,​ 이를 병렬 실행하려면 어떻게 하면 좋을까?​** 다시말해서 parallel 명령어에 인수를 전달하는 것이 아니라 명령행 자체를 제공하려면?​ 아주 간단하다.
 +
 +  $ parallel -a sourcefile {}
 +  ​
 +{.}, {/} 등은 sourcefile에서 넘어오는 라인에 대하여 다양한 조작을 할 수 있게 만들어 준다. SRR_Acc_List.txt에 SRA Run accession이 한 줄에 하나씩 들어있다고 가정하자. 이를 일괄적으로 다운로드하여 fastq로 전환하는 방법을 알아보자. ​
 +
 +  $ parallel -j 1 prefetch {} ::: $(cat SRR_Acc_List.txt)
 +  $ parallel -j 1 fastq-dump --skip-technical -F --split-files -O fastq {} ::: $(cat SRR_Acc_List.txt)
 +
 +상세한 설명은 man parallel을 해 보라.
  
 ===== 외부 자료 ===== ===== 외부 자료 =====
Line 15: Line 38:
   * [[https://​www.usenix.org/​system/​files/​login/​articles/​105438-Tange.pdf| Gnu Parallel - Parallelize Serial Command Line Programs without Changing Them]] Biostars에 소개된 자료. 특히 생명정보학자에게 유용한 예제가 풍부하게 실려있다.   * [[https://​www.usenix.org/​system/​files/​login/​articles/​105438-Tange.pdf| Gnu Parallel - Parallelize Serial Command Line Programs without Changing Them]] Biostars에 소개된 자료. 특히 생명정보학자에게 유용한 예제가 풍부하게 실려있다.
  
-===== 이것만은 이해하자 =====+
  
 ===== Local server에서 사용하기 ===== ===== Local server에서 사용하기 =====
Line 32: Line 55:
   $ cat amino_acids.faa | parallel --block 10k --recstart '>'​ --pipe blastp -evalue 0.01 -outfmt 6 -db prot2003-2014.fa -query - > result.blastout   $ cat amino_acids.faa | parallel --block 10k --recstart '>'​ --pipe blastp -evalue 0.01 -outfmt 6 -db prot2003-2014.fa -query - > result.blastout
  
 +==== 인수 목록이 파일로 존재할 때 ====
 +수백개의 fastq file을 interleaved form으로 바꾸는 경우를 생각해 보자. fwd와 rev file, 그리고 최종 파일(interleaved)의 이름이 tsv 파일 하나에 들어있다고 가정한다.
 +
 +  $ cat list.tsv
 +  file00_1.fastq ​ file00_2.fastq ​ file00.pe.fastq
 +  file01_1.fastq ​ file02_1.fastq ​ file01.pe.fastq
 +  ...
 +
 +이번에는 콜론을 4개 연이어 붙어야 한다. 동시 작업 수는 24개로 제한하였다(-j24). list.tsv의 첫 줄이 헤더라면 --header 옵션을 주어서 건너뛰게 할 수 있다.
 +  $ parallel --colsep "​\t"​ -j24 interleave-reads.py -o {3} {1} {2} :::: list.tsv
 +  ​
 +==== 출력을 파일로 저장하기 ====
 +parallel로 실행하는 명령어가 표준 출력으로 무엇인가를 내놓는다면,​ 이를 저장할 수 있다.
 +
 +  $ parallel --files __do_something__ ::: *
 +  ​
 +출력물은 /tmp 아래에 다음과 같은 형식으로 저장된다.
 +
 +  /​tmp/​parR1SSD.par
 +  /​tmp/​parjpwJL.par
 +
 +저장되는 위치를 바꾸려면 다음과 같이 환경변수를 설정한다.
 +
 +  $ TMPDIR=/​var/​tmp parallel --files __do_something__ ::: *
  
 ===== Remote server 활용하기 ===== ===== Remote server 활용하기 =====
gnu_parallel.1491868294.txt.gz · Last modified: 2017/04/11 08:51 by hyjeong