본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 메모리 부족 502 에러 해결을 위한 Pandas chunksize 활용 방법과 성능 차이

by Papa Martino V 2026. 3. 21.
728x90

Pandas chunksize
Pandas chunksize

 

 

데이터 분석가라면 누구나 한 번쯤 수 기가바이트(GB)에 달하는 CSV 파일을 pd.read_csv()로 불러오다 커널이 죽거나 'MemoryError'가 발생하는 난처한 상황을 겪어보셨을 겁니다. 일반적인 PC 환경에서 가용 RAM 용량을 초과하는 데이터를 한꺼번에 로드하는 것은 불가능에 가깝습니다. 이러한 물리적 한계를 극복하기 위한 가장 강력한 해결책이 바로 chunksize(청크사이즈) 옵션입니다. 본 가이드에서는 데이터를 조각내어 처리하는 청크 단위 로직의 내부 원리와, 단순히 읽는 것을 넘어 실무 데이터 파이프라인에 적용하는 최적화 전략 3가지를 심층적으로 다룹니다.


1. 왜 Pandas는 대용량 데이터에서 메모리 부족을 일으키는가?

Pandas는 기본적으로 모든 데이터를 메모리(RAM)에 상주시키는 In-Memory 데이터 프레임워크입니다. 1GB 크기의 CSV 파일이 메모리에 올라갈 때는 데이터 타입의 객체화 과정(Object overhead)을 거쳐 실제로는 3~5배 이상의 메모리를 점유하게 됩니다. 따라서 8GB RAM 환경에서 2~3GB 파일만 읽어도 시스템 전체가 멈추는 현상이 발생하게 됩니다.


2. chunksize 옵션의 핵심 작동 원리

chunksize를 지정하면 Pandas는 전체 데이터를 즉시 반환하지 않고, TextFileReader라는 반복자(Iterator) 객체를 반환합니다. 이를 통해 사용자는 for 루프를 사용하여 원하는 만큼의 데이터 행(Row)만 순차적으로 메모리에 올려 처리할 수 있습니다.

  • 메모리 효율성: 전체 파일이 아닌 지정된 행 수만큼만 메모리를 사용합니다.
  • 지연 평가(Lazy Evaluation): 실제로 호출하기 전까지는 데이터를 읽지 않아 초기 로딩 속도가 빠릅니다.
  • 유연한 전처리: 각 청크별로 필터링이나 집계를 수행한 뒤 결과만 합치면 최종 메모리 사용량을 90% 이상 줄일 수 있습니다.

3. 데이터 처리 방식별 성능 및 메모리 점유 차이 비교

다음 표는 5GB 규모의 데이터셋(약 5,000만 행)을 처리할 때의 리소스 사용 차이를 비교한 결과입니다.

처리 방식 메모리 사용량 (Peak) 속도 (전체 소요 시간) 적용 가능 데이터 크기
일반 read_csv() 약 15GB+ 매우 빠름 (RAM 충분 시) 가용 RAM 미만
chunksize (10만 행) 약 200MB 중간 (I/O 병목 발생) 제한 없음 (무한대)
Dask (병렬 처리) 가변적 매우 빠름 (멀티코어 활용) 매우 큰 빅데이터

4. 실전 Sample Example: 청크 단위 집계 및 필터링 해결 코드

다음 예제는 대용량 로그 파일에서 특정 조건(예: 'ERROR' 상태)인 데이터만 추출하여 저장하는 실무형 최적화 코드입니다.


import pandas as pd

# 설정값
file_path = 'large_log_data.csv'
output_path = 'filtered_error_logs.csv'
chunk_size = 50000  # 한 번에 5만 행씩 처리

# 1. 반복자(Iterator) 생성
reader = pd.read_csv(file_path, chunksize=chunk_size)

# 2. 결과 저장을 위한 첫 번째 루프 체크
first_chunk = True

for i, chunk in enumerate(reader):
    # 청크별 필터링 로직 수행
    filtered_chunk = chunk[chunk['status'] == 'ERROR']
    
    # 처리 과정 출력 (디버깅)
    print(f"현재 {i+1}번째 청크 처리 중... (누적 행: {(i+1)*chunk_size})")
    
    # 3. 파일에 순차적으로 쓰기 (Append 모드)
    if first_chunk:
        filtered_chunk.to_csv(output_path, mode='w', index=False)
        first_chunk = False
    else:
        filtered_chunk.to_csv(output_path, mode='a', index=False, header=False)

print("모든 청크 처리가 완료되었습니다.")

5. 청크 처리 시 주의사항 및 해결 팁

청크 단위를 사용할 때 가장 주의해야 할 점은 '전역 집계'입니다. 예를 들어, 전체 데이터의 평균(Mean)을 구할 때는 각 청크의 평균을 단순히 평균 내면 안 됩니다. 대신 각 청크의 합계(Sum)와 개수(Count)를 각각 누적한 뒤, 마지막에 나누는 방식을 취해야 정확한 통계 값을 얻을 수 있습니다.

전문가 조언: chunksize의 크기는 보통 10,000에서 100,000 사이가 가장 적당합니다. 너무 작으면 파이썬 루프 오버헤드가 커지고, 너무 크면 다시 메모리 부족 현상이 발생할 수 있으니 데이터의 컬럼 개수에 따라 조정하십시오.

6. 결론

Pandas의 chunksize는 하드웨어의 한계를 소프트웨어적으로 극복할 수 있게 해주는 필수적인 옵션입니다. 데이터의 크기가 커질수록 전체 로드 방식에서 청크 기반 처리 방식으로의 전환은 선택이 아닌 필수입니다. 본 가이드에서 소개한 반복자(Iterator) 활용법을 통해 더 이상 메모리 부족 오류에 시달리지 않는 견고한 데이터 분석 환경을 구축하시길 바랍니다.

 

내용 출처 및 참고 문헌:

  • Pandas Development Team. (2026). IO Tools: Iterating through files chunk by chunk.
  • Wes McKinney. (2022). Python for Data Analysis, 3rd Edition. O'Reilly.
  • Memory Profiler Python Community. Optimizing Memory Consumption in Data Pipelines.
728x90