2011-05-20 11 views
11

Mój plik to 9MB i otrzymałem ten błąd podczas ładowania skoroszytu.java.lang.OutOfMemoryError: Przestrzeń sterty Java podczas czytania programu Excel z Apache POI

XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath); 

Linia ta powoduje do java.lang.OutOfMemoryError: Java heap space

Jak mogę rozwiązać ten problem?

+1

Często zdarza się, że zabrakło pamięci, zanim podejrzewasz, że powinieneś. Tylko dlatego, że plik ma 9 MB na dysku, nie oznacza, że ​​nie zajmie dużo więcej w pamięci. Pliki XML są szczególnie złe, widziałem, jak JAX zużywa gigabajty podczas (un) rozrządzania. –

+0

http://stackoverflow.com/questions/88235/dealing-with-java-lang-outofmemoryerror-permgen-space-error –

Odpowiedz

6

myślę domyślny rozmiar sterty jest 128M

można zwiększyć za pomocą -Xmx ten argument java

np

java -Xmx512m myapp.java 
+0

A jeśli zabraknie ci stosu z powodu rekursji, pomoże Ci XX. –

+0

Co się stanie, jeśli administrator IT ma restrykcyjne ograniczenia JVM? – kiltek

+0

Moja pierwsza myśl była, @kiltek, dać ci radę, aby znaleźć inną pracę, ale być może to nie jest opcja ;-) Administrator jest najczęściej technikiem, więc powinien być w stanie zmienić zdanie dzięki technicznym argumentom, że potrzebuję pamięci do określonego celu. Jeśli powyższe nie zadziała, musisz przeszukać inne rozwiązanie. To jest nasza praca jako programistów, prawda? :-) – Wivani

16

pierwsze należy sprawdzić - czy otwierając XSSFWorkbook z InputStream lub Plik? Otwieranie go za pomocą File is much lower memory.

Dalej, czy chcesz czytać lub pisać? Jeśli pamięć jest dla ciebie bardzo napięta, istnieją alternatywne opcje używania XSSF w sposób podobny do sax.

Aby przeczytać, zobacz szczegóły dotyczące korzystania z XSSF + Sax dla http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api. Inną opcją, jeśli chcesz tylko uzyskać tekstową zawartość pliku, wtedy wygląda na to, że Apache Tika ma ekstraktor tekstu oparty na zdarzeniach dla plików .xlsx używających POI.

W celu pisania, w ostatnim czasie odbyło się wiele dyskusji na liście elementów POI, dotyczących ulepszenia "Big Grid Demo". Możesz chcieć ich przestrzegać - http://poi.apache.org/mailinglists.html

+0

masz na myśli otwierania za pomocą pliku jak w ścieżce String? jest to przestarzałe ... – pstanton

+2

Nie używaj napisu, używaj bezpośrednio obiektu File - zobacz [przewodnik szybkiego startu POI] (http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream), aby poznać szczegóły jak to zrobić – Gagravarr

3

Zgodnie z sugestią innych osób, pierwszą rzeczą do zrobienia jest zwiększenie wielkości sterty.

Jeśli to nie pomoże, lub można się spodziewać większych plików należy również przyjrzeć się tej odpowiedzi: Processing large xlsx file in Java

daje kilka dobrych punktów wyjściowych na temat tego, co można zrobić, jeśli średnia „czytać wszystkiego” tryb jest nie działa dla ciebie.

2

Myślę, że 32-bitowa maszyna JVM ma maksymalnie 2 GB pamięci. Może to być jednak nieaktualna. Jeśli dobrze zrozumiałem, ustawiasz -Xmx na launcherze Eclipse. Jeśli chcesz zwiększyć pamięć dla programu uruchamianego z Eclipse, powinieneś zdefiniować -Xmx w "Run-> Run configurations ..." (wybierz swoją klasę i otwórz zakładkę Argumenty umieść ją w obszarze argumentów VM) , a NIE w uruchomieniu Eclipse

Edytuj: szczegóły, o które pytałeś. w Eclipse 3.4

1) Uruchom-> Uruchom konfiguracje ...

2) jeśli klasa nie jest wymieniony na liście po lewej stronie w „Java Application” poddrzewa, kliknij na „nową konfigurację Uruchom” w lewym górnym rogu

2b) po prawej stronie, „Main "zakładka upewnij się, że projekt i klasa są właściwe

3) wybierz zakładkę" Argumenty "po prawej stronie. ten ma dwa obszary tekstowe. jeden jest dla argumentów programu, które wchodzą do tablicy args [] dostarczonej do twojej głównej metody. druga dotyczy argumentów VM. wstawić do tego z argumentami VM (niższy jeden iirc): -Xmx2048m

Myślę, że 1024m powinno wystarczyć na to, czego potrzebujesz!

4) Kliknij przycisk Zastosuj, a następnie kliknij polecenie Uruchom

w przypadku nadal zabraknie miejsca sterty nadal można zmienić numer na wyższą wartość, na przykład można umieścić -Xmx4g który dodaje się od 2 do Gigabyte 4 gigabajty

1

pisząc dużych plików:

Co trzeba to SXSSF (Streaming Usermodel API).

SXSSF (package: org.apache.poi.xssf.streaming) is an API-compatible streaming extension of XSSF to be used when very large spreadsheets have to be produced, and heap space is limited.

Jest to przykład na tej stronie też: trzeba zastąpić XSSFWorkbook z SXSSFWorkbook.

Skopiowano tę odpowiedź z vadchen, z another question. To zadziałało dla mnie. Potrzebowałem tylko zastąpić XSSFWorkbook dla SXSSFWorkbook w kodzie, jak powiedział.

Powiązane problemy