피드로 돌아가기
Streaming 25 Million Excel Cells Through 7 MB of Memory
Dev.toDev.to
Backend

7MB 고정 메모리로 2,500만 셀 엑셀 스트리밍 구현

Streaming 25 Million Excel Cells Through 7 MB of Memory

Arin Tumbagi2026년 6월 12일12advanced

Context

대규모 컴플라이언스 리포트 생성 시 XSSFWorkbook의 DOM 구조로 인한 Heap 메모리 과다 점유 및 OOM 발생. S3의 OutputStream API 부재와 Apache POI의 직렬화 제약으로 인해 데이터 규모에 비례해 메모리 사용량이 증가하는 구조적 한계 직면.

Technical Solution

  • Paginated Database Fetching을 통한 데이터 로드 단계의 O(batch size) 메모리 제약 설정
  • SXSSFWorkbook의 sliding window(50 rows) 적용으로 메모리 내 행 데이터를 최소화하고 나머지는 임시 파일로 Flush하는 구조 채택
  • S3 Multipart Upload를 래핑한 Custom OutputStream 구현을 통해 메모리 상의 전체 파일 구체화(Materialization) 과정 제거
  • ZipOutputStream과 S3BufferedOutputStream을 체이닝하여 ZIP 압축과 S3 업로드를 단일 스트림으로 연결
  • 각 파이프라인 단계별로 독립적인 메모리 캡(Cap)을 설정하여 데이터 크기와 무관한 O(1) 메모리 복잡도 달성

1. 대량 데이터 처리 시 전체 객체를 메모리에 올리는 DOM 방식 대신 Streaming API 검토

2. 외부 스토리지 업로드 시 Multipart Upload를 활용한 OutputStream 래핑으로 메모리 버퍼링 최소화

3. 라이브러리의 'Streaming' 모드가 쓰기(Write) 단계뿐만 아니라 직렬화(Serialize) 단계까지 지원하는지 검증

4. 파이프라인 각 단계의 메모리 점유량을 수치적으로 계산하여 최악의 상황(Worst-case)에서도 Heap 범위를 초과하지 않는지 확인

원문 읽기