2010-01-29 4 views
4

Excel 읽기 용으로 최신 POI 3.5를 사용하고 있습니다. Excel 2007 Office 2007이 설치되어 있고 해당 poi가 데이터를 실행하기 위해 XSSF를 제공하고 있습니다.Excel POI 3.5 WorkBook Java 힙 공간 예외?

데이터가 15000 라인 인 경우 제대로 실행되지만 30000 또는 100000 또는 200000까지 제한을 초과하면 Java 힙 공간 예외가 발생하기 쉽습니다.

코드는 다음과 같습니다 :

UATinput = new FileInputStream(UATFilePath); 

uatBufferedInputStream = new BufferedInputStream(UATinput); 

UATworkbook = new XSSFWorkbook(uatBufferedInputStream); 

나는 Java 힙 크기에 대한 마지막 줄에 예외를 얻고있다. -Xms256m -Xmx1536m을 사용하여 크기를 늘렸으나 더 많은 데이터를 얻기 위해 Java 힙 공간 Exception을 제공합니다.

누구든지 XSSFWorbook 예외에 대해 도움을 줄 수 있습니까?

+0

시작 힙 크기 (-Xms)보다 낮은 최대 힙 크기 (-Xmx)를 설정할 수 없습니다. - 오타를 만들었습니까? –

답변

6

대신 메모리에 전체 파일이 읽을 수있는 매우 메모리 효율적인 방법입니다 eventusermodel API를

를 사용해보십시오 읽기 큰 파일. 특정 데이터 구조가 만났을 때 콜백 메소드를 호출한다는 의미에서 SAX 파서 (DOM과 반대)의 원칙에 따라 작동합니다. 당신이이 주제

희망이 도움에 좋은 자습서를 찾을 수 있습니다 당신은 기본 데이터

Here의 본질적인 측면을 알고 기대 그것은 조금 까다로운 얻을 수 있습니다!

0

시도해보십시오. -Xms256m -Xmx512m.

0

XSSFWorkbook을 사용하는 경우 POI는 전체 Excel 파일이 포함 된 메모리 모델을 만들어야하므로 엄청난 메모리가 소비됩니다. 어쩌면 사용자 API만큼 간단하지는 않지만 더 낮은 메모리 사용을 허용하는 Event API을 사용할 수 있습니다. 당신은 또한 -Xmx에 대한 더 큰 값을 설정할 수있는 방법으로

...

0

자신의 코드에서 볼 수있는 또 다른 것은 "새로운"개체가 얼마나 많은 지입니다. 셀을 통해 읽는 동안 많은 오브젝트를 작성하면 힙을 소모 할 수도 있습니다. 작성하는 오브젝트의 수에주의를 기울여야합니다.

1

사실, UserEventModel을 사용한 후에는 성능이 정말 좋았습니다. 너희들에게 문제가 있으면 나에게 편지를 보내라. [email protected] 다른 사람들이 말했듯이

0

, 가장 좋은 건하지만 입력 스트림에서 파일을 포장하지 않는 것입니다 작은 차이를 만들 수 있습니다하여 Event API

한 가지 이상의 전환하는 것입니다! XSSF는 File을 입력으로 기꺼이 받아 들일 것이며 이는 InputStream보다 메모리 사용량이 적습니다. POI에 내용에 대한 임의 액세스가 필요하기 때문에 입력 스트림을 사용하면이를 수행하는 유일한 방법은 전체 내용을 메모리에 버퍼하는 것입니다. 파일을 사용하면 주변을 탐색 할 수 있습니다. InputStream 대신 File을 사용하면 메모리의 파일 크기보다 조금 더 절약 할 수 있습니다.

가능한 경우 파일을 전달해야합니다. 메모리가 부족하다면 InputStream을 파일에 쓴 다음 사용하십시오!

0

XLSX 기술의이면에있는 XML 데이터 그리드를 실제로 처리해야합니다. 힙 공간 문제로부터 해방 될 것입니다. 다음은 자습서입니다. 아래의 두 링크를 모두 확인하십시오.

http://poi.apache.org/spreadsheet/how-to.html

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/examples/FromHowTo.java

분석의 몇 가지 기본 지식과 SAX-XML 프로젝트의 사용

이 필요합니다.

0

JVM은 고정 된 사용 가능한 메모리로 실행됩니다. 이 메모리가 초과되면 "java.lang.OutOfMemoryError"가 수신됩니다. JVM은 시작할 때 사용 가능한 메모리를 지능적으로 선택하려고 시도하지만 (자세한 내용은 Java 설정 참조) 기본값을 다음 설정으로 덮어 쓸 수 있습니다.

성능을 향상 시키려면 JVM에서 특정 매개 변수를 사용할 수 있습니다. Xms1024m - JVM의 사용 가능한 최소 메모리를 1024 메가 바이트로 설정하십시오. Xmx1800m - JVM의 최대 사용 가능 메모리를 1800 메가 바이트로 설정하십시오. Java 응용 프로그램은이 매개 변수를 통해 정의 된 힙 메모리를 더 이상 사용할 수 없습니다.

Java 프로그램을 명령 행에서 시작하는 경우, 예를 들어 java -Xmx1024m YourProgram을 사용하십시오.

0

XSSF 위에 구축 된 메모리 부족 공간 SXSSF API 인 SXSSF를 사용할 수 있습니다. "http://poi.apache.org/spreadsheet/how-to.html#sxssf"

+0

SXSSF는 쓰기 전용입니다. SXSSF는 매우 큰 스프레드 시트를 생성해야하고 힙 공간이 제한되어있을 때 사용할 XSSF의 API 호환 스트리밍 확장입니다. –

관련 문제