Python 멀티프로세싱으로 데이터 처리 속도 개선
문제 상황
매일 아침 실행되는 배치 작업에서 약 200만 건의 CSV 데이터를 처리하는데 40분 이상 소요됐다. 각 행마다 외부 API 호출 없이 순수 계산 작업만 수행하는데도 느렸다.
기존 코드는 단순한 for loop 구조였다.
def process_row(row):
# 복잡한 계산 로직
result = heavy_calculation(row)
return result
results = []
for row in csv_reader:
results.append(process_row(row))
멀티프로세싱 적용
Python의 GIL(Global Interpreter Lock) 특성상 멀티스레딩으로는 CPU-bound 작업의 성능 향상이 어렵다. multiprocessing 모듈을 사용해 프로세스 단위로 분산 처리했다.
from multiprocessing import Pool
import csv
def process_row(row):
result = heavy_calculation(row)
return result
if __name__ == '__main__':
with open('data.csv', 'r') as f:
reader = csv.reader(f)
rows = list(reader)
with Pool(processes=4) as pool:
results = pool.map(process_row, rows)
결과 및 주의사항
처리 시간이 40분에서 9분으로 단축됐다. 서버 CPU 코어가 4개라 processes=4로 설정했다.
주의할 점은 프로세스 간 데이터 전달 시 pickle 직렬화가 발생한다는 것이다. 너무 큰 객체를 인자로 넘기면 오버헤드가 커진다. 우리 경우 row 데이터가 작아서 문제없었다.
또한 if __name__ == '__main__': 가드를 반드시 써야 Windows 환경에서 무한 프로세스 생성을 막을 수 있다.
chunksize 파라미터를 조정하면 추가 최적화도 가능하다. 기본값 대신 pool.map(process_row, rows, chunksize=1000) 같이 지정하면 IPC 오버헤드를 줄일 수 있다.