2011-05-20 73 views
11

Mi archivo es 9MB y recibí este error al cargar el libro de trabajo.java.lang.OutOfMemoryError: espacio en el montón de Java al leer Excel con Apache POI

XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath); 

esta línea hace que java.lang.OutOfMemoryError: Java heap space

¿Cómo puedo solucionar esto?

+1

No es raro que se quede sin memoria antes de pensar que debería hacerlo. El hecho de que el archivo tenga 9 MB en el disco no significa que no ocupe mucho más en la memoria. Los archivos XML son especialmente malos, he visto que JAX usa gigabytes durante (des) clasificación. –

+0

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

Respuesta

6

Creo tamaño de la pila por defecto es 128M

puede incrementar este valor con el argumento -Xmx a java

por ejemplo,

java -Xmx512m myapp.java 
+0

Y si te quedas sin pila debido a la recursión, -Xms te ayudará. –

+0

¿Qué pasa si tengo restricciones estrictas de JVM por parte del administrador de TI? – kiltek

+0

Mi primer pensamiento fue, @kiltek, para darle el consejo de encontrar otro trabajo, pero tal vez esa no sea una opción ;-) El administrador es más comúnmente un techy, por lo que debería poder cambiar de opinión con argumentos técnicos que usted Necesito la memoria para su propósito específico. Si lo anterior no le funciona, tendrá que buscar otra solución. Ese es nuestro trabajo como desarrolladores, ¿no? :-) – Wivani

16

primero que debe verificar - estás abriendo la XSSFWorkbook con un InputStream o un archivo? Abriéndolo con un File is much lower memory.

A continuación, ¿quieres leer o escribir? Si la memoria es muy estrecha para usted, existen opciones alternativas para usar XSSF de forma similar a un saxofón.

Para leer, consulte http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api para obtener detalles sobre el uso de XSSF + Sax. Como otra opción, si solo desea obtener el contenido textual del archivo, parece que Apache Tika tiene un extractor de texto basado en eventos para archivos .xlsx que usan POI.

Para escribir, ha habido muchas discusiones sobre la lista de desarrolladores de POI recientemente sobre cómo mejorar la "Gran demostración de cuadrícula". Es posible que desee seguir esos - http://poi.apache.org/mailinglists.html

+0

¿te refieres a abrir con un archivo como en la ruta String? esto está en desuso ... – pstanton

+2

No use una cadena, use un objeto File directamente - vea [la guía de inicio rápido de POI] (http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream) para detalles de cómo hacerlo – Gagravarr

3

Como lo sugirieron otros, lo primero que debe hacer es aumentar el tamaño del montón.

Si esto no funciona o que esperan archivos más grandes también se debe echar un vistazo a esta respuesta: Processing large xlsx file in Java

Se da unos buenos puntos de partida sobre qué se puede hacer si la norma "leer todo" modo es no funciona para ti

2

Creo que una JVM de 32 bits tiene un máximo de 2 GB de memoria. Sin embargo, esto podría estar desactualizado. Si entendí correctamente, configura el -Xmx en el iniciador de Eclipse. Si desea aumentar la memoria del programa que ejecuta desde Eclipse, debe definir -Xmx en "Ejecutar-> Ejecutar configuraciones ..." (seleccione su clase y abra la pestaña Argumentos y colóquela en el área de argumentos de VM) y NO en el inicio de Eclipse

Editar: los detalles que solicitó. en Eclipse 3.4

1) Ejecutar-> Ejecutar configuraciones ...

2) si la clase no aparece en la lista de la izquierda en el subárbol "Aplicación Java", haga clic en "Configuración del nuevo lanzamiento" en la esquina superior izquierda

2b) a la derecha, "Principal "tab asegúrese de que el proyecto y la clase sean los correctos

3) seleccione la pestaña" Argumentos "a la derecha. este tiene dos áreas de texto. uno es para los argumentos del programa que ingresan a la matriz args [] proporcionada a su método principal. el otro es para los argumentos de VM. poner en el uno con los argumentos VM (iirc más bajo) lo siguiente: -Xmx2048m

¡Creo que 1024m debería ser más que suficiente para lo que necesita!

4) Haga clic en Aplicar y, a continuación Haga clic en Ejecutar

En caso de que todavía se queda sin espacio de almacenamiento dinámico todavía se puede cambiar el número a un valor más alto, por ejemplo, se puede poner -Xmx4g lo que equivale a 2 gigabytes de 4 Gigabytes

1

Al escribir archivos grandes:

Lo que necesita es SXSSF (API Transmisión UserModel).

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.

No es un ejemplo de esa página también: hay que sustituir XSSFWorkbook con SXSSFWorkbook.

Copiado esta respuesta desde vadchen, desde another question. Funcionó para mí Solo necesitaba reemplazar XSSFWorkbook por SXSSFWorkbook en el código, como él dijo.

Cuestiones relacionadas