Pythonist - 2013년 4월 19일 12:17:42 오전
NGS 파일들 다루다 보니 죽치고 기다려야 하는 경우가 많아 CPU도 많겠다 멀티프로세싱으로 만드는 중 알게 된 팁하나.
multiprocessing 모듈의 Poll 인스턴스 메쏘드 imap이 그때그때 바로 결과를 주는 점에 착안, 얘 혹시 입력으로 반복자(iterator)를 줘도 도나 보니 잘 되네. 이러면 입력과 출력을 순차적으로 이어줄 수 있지. 파이프(|)로 활용 가능.
import multiprocessing, time, random
def square(x):
sec = random.choice([1, 2, 3])
print('before {0} wait {1} sec'.format(x, sec))
time.sleep(sec)
print('after {0}'.format(x))
return x * x
def g(n):
i = 0
while i < n:
yield i
i += 1
pool = multiprocessing.Pool(processes=4)
for each in pool.imap(square, g(20)):
print(each, flush=True)
위 코드를 돌려보면 함수 square의 실행이 비동기적이면서도 그때그때 결과가 나오고 순서는 보존됨을 알 수 있다. 입력을 제너레이터로 해도 됨. 즉 다음과 같은 코드가 가능하다.
import sys, multiprocessing
def upper(line):
return line.upper()
p = multiprocessing.Pool(processes=4)
for line in p.imap(upper, sys.stdin):
sys.stdout.write(line)
sys.stdout.flush()
p.close()
파일을 라인단위로 읽어 대문자로 바꿔주는데 4개 프로세스로 진행된다. 만일 순서를 보장하지 않아도 된다면 imap_unordered 로 좀 더 빠르게 돌릴 수 있다.
Posted by Hyungyong Kim (yong27)
태그(들): NGS, imap, iterative, multiprocessing, poll, python