Python 멀티프로세싱으로 대용량 CSV 처리 속도 개선

문제 상황

재택근무로 전환되면서 로컬 환경에서 데이터 처리를 돌려야 하는 상황이 생겼다. 기존에는 서버에서 돌리던 5GB CSV 파일 처리가 단일 프로세스로 40분 넘게 걸렸다.

기존 코드는 pandas로 청크 단위로 읽어 처리하는 구조였다.

import pandas as pd

for chunk in pd.read_csv('data.csv', chunksize=10000):
    processed = process_data(chunk)
    save_to_db(processed)

해결 방법

multiprocessing.Pool을 활용해 청크를 병렬로 처리하도록 변경했다.

import pandas as pd
from multiprocessing import Pool, cpu_count

def process_chunk(chunk_data):
    df = pd.DataFrame(chunk_data)
    # 처리 로직
    return processed_df

if __name__ == '__main__':
    chunks = pd.read_csv('data.csv', chunksize=10000)
    chunk_list = [chunk for chunk in chunks]
    
    with Pool(cpu_count() - 1) as pool:
        results = pool.map(process_chunk, chunk_list)
    
    final_df = pd.concat(results, ignore_index=True)

주의사항

처음에 전체 CPU 코어를 다 사용했다가 맥북이 버벅이는 문제가 있었다. cpu_count() - 1로 조정해서 최소한의 여유를 남겨뒀다.

또한 if __name__ == '__main__' 가드를 빼먹으면 자식 프로세스가 무한 생성되는 이슈가 있어 필수로 추가해야 한다.

메모리 사용량도 늘어나므로 청크 크기 조절이 중요했다. 10000 row씩 처리할 때가 가장 효율적이었다.

결과

처리 시간이 40분에서 12분으로 줄었다. 재택 환경에서도 충분히 처리 가능한 수준이 되었다.

Python 멀티프로세싱으로 대용량 CSV 처리 속도 개선