2016년 12월 7일 수요일

JVM 메모리를 넘는 Huge Excel 파일 입출력

https://poi.apache.org/spreadsheet/limitations.html

  위의 링크 내용 중 메모리에 관한 내용만을 추리면 아래와 같다.


- - - - - - - - - - - -

디폴트 POI 클래스들을 쓰는 것만으로는 memory의 한계가 있다. 
그러므로 매우 큰 Excel 파일을 읽거나 쓰려고 한다면 Out of memory를 만나게 될 것이다.
Main memory에 Excel 처리를 위한 객체를 올려서 작업하는 스타일 때문인데, 이것을 극복하기 위한 방법이 있다.

* 매우 큰 파일을 쓰기 위한 SXSSFWorkbook이 있다. 이것은 data를 streaming으로 쓸 수 있도록 도와준다.

* 매우 큰 파일을 읽기 위해서는XLSX2CSV 을 참고해 볼 수 있다. Excel 파일을 streaming 형태로 읽을 수 있도록 하며, 읽어들이는 정보의 한계가 있으므로 필요할 경우 수정해서 사용할 수 있다.

- - - - - - - - - - - -

  위의 내용 중 매우 큰 Excel 파일 읽기에 대한 경험이 있다. 소스 코드(XLSX2CSV)를 참고로 하여, Excel(XLSX)를 파싱하면서 몇가지 문제가 겪었다.

  일단 Excel(XLSX) 파일은 XML 파일들과 그 외 메타데이터를 포함한 압축파일이다. (그래서 .xlsx 파일을 확장자만 .zip 파일로 변경하면 압축해제를 할 수 있기도 하다.)
  아무튼 XLSX2CSV 예제는 엑셀을 XML 형태로 읽어 들여 element 별로 처리를 해서 데이터를 읽도록 되어 있다.
  XML Parsing 라이브러리를 사용해서 streaming으로 읽기 작업을 처리할 수 있게 된 것인데, 그러면서 생긴 제약이 Excel에서 비어 있는 셀에 대해서 xml이 비어있을 수 있는 문제가 발생하게 된다. 그래서 실제로 사용하면서 필요했던 내용들을 어떻게 보면 하드코딩 방식으로 때워가며 사용했었다.

  가장 일반적인 형태로 xml의 element가 비어 있는 시나리오가 3가지가 있었고, 그러한 상황에 대처하기 위해 method를 추가하는 식으로 작업을 했다.

  매번 재작업하기 보다는 미리 정리해놓고 사용할 수 있었으면 좋겠다는 생각이 들어서 github repository에 올려놓았다.

https://github.com/sungpeo/large-xlsxtocsv


댓글 없음:

댓글 쓰기