대용량 엑셀 파일 업로드 구현

hailey·2024년 9월 26일

면접질문

목록 보기
6/6

1-2GB 정도의 큰 엑셀 파일을 업로드할 때 시간이 오래 걸리는 상황에서 어떻게 개선시킬 수 있을 것인가?

의도

성능 최적화와 효율적인 데이터 처리에 대한 이해

모범 답변

아래 방식들을 활용하여 대용량 데이터를 효율적으로 처리하는 방법을 설명하는 것이 중요하다.

  • 메모리 관리
  • 병렬 처리
  • 스트리밍 방식

답변 예시

먼저 SAX 파싱 방식을 통해 파일을 처리하겠습니다.
SAX 방식은 엑셀 파일을 메모리에 한번에 올리지 않고 스트리밍 방식으로 처리하므로, 메모리 사용량을 최소화할 수 있습니다.

  1. SAX 파싱을 사용한 스트리밍 방식 도입
  • 엑셀 파일을 SAX 방식으로 읽으면, XML 처럼 한 줄씩 파일을 읽어가며 필요한 데이터를 처리할 수 있습니다.
  • 이를 통해 메모리에서 데이터를 모두 올리지 않고, 필요한 부분만 순차적으로 처리하게 됩니다.
  • 예를 들어, 각 행을 한 번에 메모리로 가져오지 않고, 한 행씩 읽고 처리한 뒤, 메모리에서 해제합니다.
  1. 병렬 처리 및 배치 처리
  • 파일이 매우 크기 때문에 병렬 처리를 통해 속도를 개선할 수 있습니다. 각 시트를 병렬로 처리하거나, 또는 각 배치를 분할해 여러 쓰레드에서 동시에 처리할 수 있습니다.
  • 예를 들어, 한 번에 1000행씩 읽고 그 데이터를 데이터베이스에 저장한 뒤 메모리를 정리하는 방식을 사용할 수 있습니다.
  1. 파일의 덩어리를 나눠서 처리
  • 대용량 파일의 경우, 전체를 한 번에 처리하는 대신 파일을 여러개의 작은 덩어리로 나누어 부분적으로 처리하는 것이 좋습니다.
  • 예를 들어, 파일의 1GB를 100MB 단위로 나눠 순차적으로 업로드하고, 각 파일 처리를 마친 후 데이터베이스에 배치 저장하는 방식입니다.
  1. 비동기 처리
  • 대용량 파일 처리를 비동기적으로 처리할 수 있습니다. 업로드와 데이터베이스 저장을 비동기적으로 처리하여 파일을 업로드하는 동안 사용자에게 피드백을 제공하고, 처리 시간을 단축할 수 있습니다.
  1. 압축 및 네트워크 최적화
  • 파일 업로드 전에 압축하거나 전송 중에 네트워크 속도 문제를 최소화하기 위해 파일을 작은 청크로 나누어 전송할 수 있습니다.
  • 이를 통해 네트워크에 전송 시간을 줄이고 효율적으로 업로드할 수 있습니다.

수도 코드 예시

// 파일 스트리밍 방식으로 엑셀 파일 읽기
open Excel File as InputStream

// SAX 방식으로 XML-like 파싱
for each sheet in Excel File:
    start SAX Parser
    for each row in sheet:
        process row data
        if row count reaches batch size:
            save batch to database
            clear memory (Garbage Collection)

    after finishing sheet:
        save remaining rows to database

요약

  1. 메모리 최적화 : SAX 파싱은 메모리 사용량을 최소화하는 방식이므로 대용량 파일에 매우 적합하다.
  2. 병렬 처리/비동기 처리 : 큰 데이터를 처리할 때 병렬 처리나 비동기 방식으로 성능을 개선할 수 있다.

SAX 파싱 방식의 이해

  1. SAX 파싱 이란?
    이벤트 기반의 XML 파싱 방식이다. 데이터를 한 번에 모두 메모리에 로드하지 않고, 스트림 방식으로 XML 파일을 순차적으로 읽고, 각 태그나 요소에 대한 이벤트를 발생시켜 데이터를 처리한다.

  2. 왜 SAX 방식이 대용량 파일에 적합한가?

  • 메모리 효율성 : SAX 방식은 파일을 순차적으로 한 줄씩 읽어 처리하기 때문에, 대용량 파일을 처리할 때도 메모리를 많이 사용하지 않는다. 파일을 한번에 메모리에 모두 올리지 않고 필요한 부분만 읽어 처리한다.
  • 속도 : DOM 방식 처럼 XML 문서를 한 번에 메모리에 로드해서 트리를 구성하지 않으므로, 대용량 파일 처리 시 메모리 부족 문제를 방지할 수 있고, 처리 속도도 빠르다.
  • 읽기 전용 : SAX 는 읽기 전용 파싱 방식이기 때문에, 데이터를 순차적으로 읽기만 하는 상황(대용량 데이터 읽기)에 적합하다.
  1. SAX 파싱의 기본 동작 원리
  • SAX 파서는 파일을 읽을 때 태그의 시작, 끝, 텍스트 데이터를 발견할 때마다 이벤트를 발생시킨다.
  • 예를 들어, <row> 태그가 시작되면 startElement 이벤트가 발생하고, <cell> 안에 있는 데이터가 발견되면 characters 이벤트가 발생해서 그 데이터를 처리한다.
  • 태그가 닫힐 때 endElement 이벤트가 발생해서 태그가 끝났음을 알려준다.
  1. SAX 방식의 동작 방식 수도코드
open InputStream from Excel file

start SAX Parser

for each XML element in the stream:
    if start of element:
        process startElement event
    if characters inside element:
        process characters event
    if end of element:
        process endElement event
  1. SAX 파싱을 사용하는 사례 : 엑셀 파일
  • .xlsx 파일은 내부적으로 XML 기반으로 구성되어 있다. 따라서 SAX 파서는 엑셀 파일의 각 시트와 셀을 XML 구조처럼 읽을 수 있다.
  • 이를 통해 엑셀 파일의 데이터를 순차적으로 읽으면서 대용량 파일을 효율적으로 처리할 수 있다.
  1. SAX 방식과 병렬 처리
  • SAX 파싱 방식에서 병렬 처리를 적용하여 여러 시트를 동시에 처리하거나, 데이터를 일정한 크기(예, 1000행 단위)로 나누어 배치 처리하는 방식으로 성능을 더욱 개선할 수 있다.
profile
Fail Fast, Fail Often

0개의 댓글