2011-05-20 17 views
11

Il mio file è 9MB e ho ricevuto questo errore durante il caricamento della cartella di lavoro.java.lang.OutOfMemoryError: spazio heap Java durante la lettura excel con Apache POI

XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath); 

questa linea fa sì che java.lang.OutOfMemoryError: Java heap space

Come posso risolvere questo problema?

+1

Non è raro esaurire la memoria prima che tu pensi che dovresti. Solo perché il file è di 9 MB su disco non significa che non occuperà molto di più in memoria. I file XML sono particolarmente negativi, ho visto JAX consumare un gigabyte durante il marshalling (non). –

+0

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

risposta

6

Penso dimensione predefinita heap è 128M

è possibile aumentare questo utilizzando l'argomento -Xmx a java

esempio

java -Xmx512m myapp.java 
+0

E se si esaurisce lo stack a causa della ricorsione, -Xms aiuterà. –

+0

Cosa succede se ho delle restrittive restrizioni JVM da parte dell'amministratore IT? – kiltek

+0

Il mio primo pensiero è stato, @kiltek, di darti il ​​consiglio di trovare un altro lavoro, ma forse non è un'opzione ;-) L'amministratore è più comunemente un tecnico, quindi dovrebbe essere in grado di cambiare idea con argomenti tecnici che ho bisogno della memoria per il tuo scopo specifico. Se quanto sopra non funziona, dovrai cercare un'altra soluzione. Questo è il nostro lavoro come sviluppatori, no? :-) – Wivani

16

prima cosa da controllare - stai aprendo la XSSFWorkbook con una InputStream o un file ? Aprendolo con un File is much lower memory.

Avanti, vuoi leggere o scrivere? Se la memoria è molto stretta per te, ci sono alternative per l'uso di XSSF in un modo simile al sax.

Per la lettura, vedere http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api per dettagli sull'uso di XSSF + Sax. Come altra opzione, se vuoi solo ottenere il contenuto testuale del file, sembra che Apache Tika abbia un estrattore di testi basato su eventi per i file .xlsx che usano POI.

Per la scrittura, ci sono state molte discussioni sulla lista dei PDI di recente sul miglioramento della "Big Grid Demo". Si potrebbe voler seguire quelli - http://poi.apache.org/mailinglists.html

+0

intendi l'apertura con un file come nel percorso String? questo è deprecato ... – pstanton

+2

Non usare una stringa, usa direttamente un oggetto File - vedi [la guida rapida sull'indirizzamento dei POI] (http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream) per i dettagli di come farlo – Gagravarr

3

Come suggerito da altri, la prima cosa da fare è aumentare la dimensione dell'heap.

Se il problema persiste o si aspettano i file più grandi si dovrebbe anche dare un'occhiata a questa risposta: Processing large xlsx file in Java

dà un paio di buoni punti di partenza su cosa si può fare se la norma "leggere tutto" modalità è non funziona per te

2

Penso che una JVM a 32 bit abbia una memoria massima di 2 GB. Tuttavia potrebbe non essere aggiornato. Se ho capito bene, hai impostato -Xmx su launcher di Eclipse. Se si desidera aumentare la memoria per il programma eseguito da Eclipse, è necessario definire -Xmx in "Esegui-> Esegui configurazioni ..." (selezionare la classe e aprire la scheda Argomenti posizionarlo nell'area Argomenti VM) menu e NOT all'avvio di Eclipse

Modifica: dettagli richiesti. in Eclipse 3.4

1) Esegui-> Esegui configurazioni ...

2) se la classe non è elencato nella lista a sinistra nella sottostruttura "Java Application", cliccare su "Configurazione nuovo lancio" nell'angolo in alto a sinistra

2b) a destra, "Main "scheda assicurarsi che il progetto e la classe siano quelli giusti

3) selezionare la scheda" Argomenti "sulla destra. questo ha due aree di testo. uno è per gli argomenti del programma che entrano nell'array args [] fornito con il metodo principale. l'altro è per gli argomenti VM. mettere in uno con gli argomenti VM (uno inferiore iirc) il seguente: -Xmx2048m

Penso che 1024 m dovrebbe più che sufficiente per quello che ti serve però!

4) Fare clic su Applica, quindi su Esegui

Nel caso in cui si corre ancora fuori lo spazio di heap è ancora possibile cambiare il numero su un valore superiore, per esempio si può mettere -Xmx4g che aggiunge su da 2 Gigabyte di 4 Gigabyte

1

Durante la scrittura di file di grandi dimensioni:

Quello che vi serve è 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.

V'è un esempio in quella pagina troppo: è necessario sostituire XSSFWorkbook con SXSSFWorkbook.

Copiato questa risposta da vadchen, da another question. Ha funzionato per me. Avevo solo bisogno di sostituire XSSFWorkbook per SXSSFWorkbook nel codice, come ha detto.

Problemi correlati