1-2GB 정도의 큰 엑셀 파일을 업로드할 때 시간이 오래 걸리는 상황에서 어떻게 개선시킬 수 있을 것인가?
의도
성능 최적화와 효율적인 데이터 처리에 대한 이해
모범 답변
아래 방식들을 활용하여 대용량 데이터를 효율적으로 처리하는 방법을 설명하는 것이 중요하다.
답변 예시
먼저 SAX 파싱 방식을 통해 파일을 처리하겠습니다.
SAX 방식은 엑셀 파일을 메모리에 한번에 올리지 않고 스트리밍 방식으로 처리하므로, 메모리 사용량을 최소화할 수 있습니다.
- SAX 파싱을 사용한 스트리밍 방식 도입
- 엑셀 파일을 SAX 방식으로 읽으면, XML 처럼 한 줄씩 파일을 읽어가며 필요한 데이터를 처리할 수 있습니다.
- 이를 통해 메모리에서 데이터를 모두 올리지 않고, 필요한 부분만 순차적으로 처리하게 됩니다.
- 예를 들어, 각 행을 한 번에 메모리로 가져오지 않고, 한 행씩 읽고 처리한 뒤, 메모리에서 해제합니다.
- 병렬 처리 및 배치 처리
- 파일이 매우 크기 때문에 병렬 처리를 통해 속도를 개선할 수 있습니다. 각 시트를 병렬로 처리하거나, 또는 각 배치를 분할해 여러 쓰레드에서 동시에 처리할 수 있습니다.
- 예를 들어, 한 번에 1000행씩 읽고 그 데이터를 데이터베이스에 저장한 뒤 메모리를 정리하는 방식을 사용할 수 있습니다.
- 파일의 덩어리를 나눠서 처리
- 대용량 파일의 경우, 전체를 한 번에 처리하는 대신 파일을 여러개의 작은 덩어리로 나누어 부분적으로 처리하는 것이 좋습니다.
- 예를 들어, 파일의 1GB를 100MB 단위로 나눠 순차적으로 업로드하고, 각 파일 처리를 마친 후 데이터베이스에 배치 저장하는 방식입니다.
- 비동기 처리
- 대용량 파일 처리를 비동기적으로 처리할 수 있습니다. 업로드와 데이터베이스 저장을 비동기적으로 처리하여 파일을 업로드하는 동안 사용자에게 피드백을 제공하고, 처리 시간을 단축할 수 있습니다.
- 압축 및 네트워크 최적화
- 파일 업로드 전에 압축하거나 전송 중에 네트워크 속도 문제를 최소화하기 위해 파일을 작은 청크로 나누어 전송할 수 있습니다.
- 이를 통해 네트워크에 전송 시간을 줄이고 효율적으로 업로드할 수 있습니다.
수도 코드 예시
// 파일 스트리밍 방식으로 엑셀 파일 읽기
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
요약
- 메모리 최적화 : SAX 파싱은 메모리 사용량을 최소화하는 방식이므로 대용량 파일에 매우 적합하다.
- 병렬 처리/비동기 처리 : 큰 데이터를 처리할 때 병렬 처리나 비동기 방식으로 성능을 개선할 수 있다.
SAX 파싱 방식의 이해
-
SAX 파싱 이란?
이벤트 기반의 XML 파싱 방식이다. 데이터를 한 번에 모두 메모리에 로드하지 않고, 스트림 방식으로 XML 파일을 순차적으로 읽고, 각 태그나 요소에 대한 이벤트를 발생시켜 데이터를 처리한다.
-
왜 SAX 방식이 대용량 파일에 적합한가?
- 메모리 효율성 : SAX 방식은 파일을 순차적으로 한 줄씩 읽어 처리하기 때문에, 대용량 파일을 처리할 때도 메모리를 많이 사용하지 않는다. 파일을 한번에 메모리에 모두 올리지 않고 필요한 부분만 읽어 처리한다.
- 속도 : DOM 방식 처럼 XML 문서를 한 번에 메모리에 로드해서 트리를 구성하지 않으므로, 대용량 파일 처리 시 메모리 부족 문제를 방지할 수 있고, 처리 속도도 빠르다.
- 읽기 전용 : SAX 는 읽기 전용 파싱 방식이기 때문에, 데이터를 순차적으로 읽기만 하는 상황(대용량 데이터 읽기)에 적합하다.
- SAX 파싱의 기본 동작 원리
- SAX 파서는 파일을 읽을 때 태그의 시작, 끝, 텍스트 데이터를 발견할 때마다 이벤트를 발생시킨다.
- 예를 들어,
<row> 태그가 시작되면 startElement 이벤트가 발생하고, <cell> 안에 있는 데이터가 발견되면 characters 이벤트가 발생해서 그 데이터를 처리한다.
- 태그가 닫힐 때 endElement 이벤트가 발생해서 태그가 끝났음을 알려준다.
- 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
- SAX 파싱을 사용하는 사례 : 엑셀 파일
.xlsx 파일은 내부적으로 XML 기반으로 구성되어 있다. 따라서 SAX 파서는 엑셀 파일의 각 시트와 셀을 XML 구조처럼 읽을 수 있다.
- 이를 통해 엑셀 파일의 데이터를 순차적으로 읽으면서 대용량 파일을 효율적으로 처리할 수 있다.
- SAX 방식과 병렬 처리
- SAX 파싱 방식에서 병렬 처리를 적용하여 여러 시트를 동시에 처리하거나, 데이터를 일정한 크기(예, 1000행 단위)로 나누어 배치 처리하는 방식으로 성능을 더욱 개선할 수 있다.