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 [2020/06/11 17:09] (current)
hyjeong [CPU와 core 수 알아내기]
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 25: Line 48:
   $ parallel --number-of-cores   $ parallel --number-of-cores
   32   32
 +이런 바보! 그냥 명령행에서 nproc라고만 치면 된다!
 ==== BLAST 실행하기 ==== ==== BLAST 실행하기 ====
  
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