2017-12-19 3 views
2

엑셀 파일을 읽기 위해 아파치 POI를 사용하고 있습니다. 내 파일은 약 100MB이며, 나는이 java.lang.OutOfMemoryError와있어 : Java 힙을 자사의 -Xmx에게 너무 큰를 사용하는 것을 여유가있을 수로드 통합 문서java.lang.OutOfMemoryError : 큰 엑셀 파일을위한 자바 힙 공간

XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath); 

내 컴퓨터의 RAM이 8기가바이트된다. 그래서 내 질문은 어떻게이 오류를 처리 할 수 ​​있습니까?

편집

내 데이터의

샘플 (내 데이터에 대한 1,087,490 행입니다) : 모든

enter image description here

+2

예를 들어 몇 가지 실험을 하시나요? ** 머신 ** 및 ** 워크로드 **에서 -Xmx가 ** 작동하는 숫자는 알 수 없습니다. 당신은 다른 한편으로는 쉽게 자신을 테스트 할 수 있습니다! – GhostCat

+0

어떤 데이터가 엑셀 파일을 100MB로 만들었습니까? 텍스트 또는 이미지입니까? 구체적 ... –

+0

나는 이미 그것을 실험했습니다. 내 컴퓨터처럼 보이는이 XSSFWorkbook을 감당할 수 없지만 내 컴퓨터가 100MB의 파일을 읽을 수 있도록 다른 라이브러리 또는 방법이 있습니까? –

답변

5

첫째 - 당신은 당신의 파일은 잘 정의 내에 있는지 확인해야합니다 도구의 한계 - here을 참조하십시오. 그 너머

, 그것은 큰 파일에 대한 메모리가 부족하기 매우 일반적인 문제 것, 그리고 하나 개의 솔루션은 "수동으로"XML 데이터를 처리하는 것입니다

If memory footprint is an issue, then for XSSF, you can get at the underlying XML data, and process it yourself. This is intended for intermediate developers who are willing to learn a little bit of low level structure of .xlsx files, and who are happy processing XML in java. Its relatively simple to use, but requires a basic understanding of the file structure. The advantage provided is that you can read a XLSX file with a relatively small memory footprint.

(here에서 인용)

+1

이 경우에는 [기본 제한] (https://poi.apache.org/spreadsheet/limitations.html) – XtremeBaumer

+0

내 데이터는 약 1087490 레코드 (행)입니다. 이 솔루션을 시험해 보겠습니다. –

+2

[SXSSF (Streaming Usermodel API)] (https://poi.apache.org/spreadsheet/how-to.html#SXSSF+%28Streaming+Usermodel+API%29)는 " 매우 큰 스프레드 시트가 ** 생성되어야 할 때 ** ". ** 읽기 ** 대용량 파일 [XSSF 및 SAX (이벤트 API)] (https://poi.apache.org/spreadsheet/how-to.html#XSSF+and+SAX+%28Event+API%29)이 필요합니다. 대신. –

관련 문제