Python 멀티프로세싱으로 CSV 대량 처리 성능 개선
문제 상황
매일 새벽 실행되는 배치 작업에서 고객 데이터 CSV(약 50만 건)를 파싱하고 변환하는 작업이 있었다. 단순 반복문으로 처리하니 약 40분이 소요됐고, 이후 작업들이 지연되는 문제가 발생했다.
기존 코드
import csv
import pandas as pd
def process_row(row):
# 데이터 정제 및 변환 로직
return transformed_row
with open('data.csv', 'r') as f:
reader = csv.DictReader(f)
results = [process_row(row) for row in reader]
단일 코어로 순차 처리하다 보니 CPU 사용률이 25% 정도에 머물렀다.
해결 방법
multiprocessing.Pool을 사용해 4개 프로세스로 분산 처리하도록 변경했다.
from multiprocessing import Pool
import csv
def process_row(row):
# 동일한 변환 로직
return transformed_row
def read_csv_chunk(filename):
with open(filename, 'r') as f:
reader = csv.DictReader(f)
return list(reader)
if __name__ == '__main__':
rows = read_csv_chunk('data.csv')
with Pool(processes=4) as pool:
results = pool.map(process_row, rows)
# 결과 저장
pd.DataFrame(results).to_csv('output.csv', index=False)
결과
- 처리 시간: 40분 → 10분
- CPU 사용률: 25% → 95%
- 메모리 사용량은 약간 증가했지만 허용 범위 내
주의사항
if __name__ == '__main__':가드는 필수다. 없으면 프로세스가 무한 생성된다.- 처리할 데이터가 피클 가능한(picklable) 객체여야 한다.
- 메모리에 전체 데이터를 올리기 부담스러우면 청크 단위로 나눠서 처리하는 방식을 고려해야 한다.
간단한 변경으로 큰 효과를 봤다. I/O 바운드 작업이 아니라면 멀티프로세싱이 효과적이다.