레시피: 대용량 파일을 쪼개서 병렬 처리하기 (Splitting)
매우 큰 데이터 파일을 처리할 때, 파일 전체를 하나의 프로세스로 처리하는 것보다 여러 조각으로 나누어 병렬로 처리하는 것이 훨씬 빠를 때가 있습니다.
기본 전략
- 대용량 입력 파일을 작은 조각(chunk)들로 나눕니다.
- 나뉜 조각들에 대해 병렬로 작업을 수행합니다.
- (필요한 경우) 개별 결과를 다시 하나로 합칩니다.
Snakemake 예시
유닉스의 split 명령어를 사용하여 대용량 텍스트 파일을 조각내는 워크플로입니다.
rule all:
input:
"results/processed_combined.txt"
# 1. 파일 쪼개기
rule split_file:
input:
"data/large_data.txt"
output:
temp(expand("data/chunks/part_{num}.txt", num=["00", "01", "02", "03"]))
shell:
# 1000줄씩 나누어 'part_' 접두사를 붙여 저장
"split -l 1000 {input} data/chunks/part_"
# 2. 각 조각 처리 (와일드카드 활용)
rule process_chunk:
input:
"data/chunks/part_{num}.txt"
output:
"data/chunks/processed_{num}.txt"
shell:
"some_analysis_tool {input} > {output}"
# 3. 결과 합치기
rule combine_results:
input:
expand("data/chunks/processed_{num}.txt", num=["00", "01", "02", "03"])
output:
"results/processed_combined.txt"
shell:
"cat {input} > {output}"참고 사항
temp()함수: 쪼개진 조각들은 최종 결과가 만들어진 후에는 필요 없는 경우가 많습니다.temp()를 사용하면 워크플로가 끝나고 자동으로 삭제됩니다.- Checkpoint: 만약 파일을 몇 조각으로 나눌지 미리 알 수 없는 경우(예: 파일 크기에 따라 유동적인 경우), Snakemake의
checkpoint기능을 사용하여 동적인 병렬 처리를 구현할 수 있습니다. - 도구 고유 기능:
split명령어 외에도 생물정보학 도구(예:fastp,samtools) 중에는 자체적으로 데이터를 쪼개어 출력하는 기능을 가진 것들이 많으니 먼저 확인해 보세요.