web-dev-qa-db-fra.com

java.lang.outofMemoryError: Java espace de tas en lisant Excel avec Apache POI

Mon fichier est 9 Mo et j'ai reçu cette erreur lors du chargement du classeur.

XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath); 

cette ligne provoque Java.lang.OutOfMemoryError: Java heap space

Comment puis-je resoudre ceci?

18
user467871

Comme suggéré par d'autres, la première chose à faire est d'augmenter la taille du tas.

Si cela ne vous aide pas ou si vous attendez des fichiers plus gros, vous devez également jeter un coup d'œil à cette réponse: Traitement de grand fichier XLSX en Java

Il donne quelques bons points de départ sur ce qui peut être fait si le mode "Lire tout" standard ne fonctionne pas pour vous.

3
Turismo

Lorsque vous écrivez de gros fichiers:

Ce dont vous avez besoin est SXSSF (Streaming usermodel API).

SXSSF (emballage: org.apache.poi.xssf.streaming) est une extension de streaming compatible API de XSSF à utiliser lorsque de très grandes feuilles de calcul doivent être produites et que l'espace de démarrage est limité.

Il y a aussi un exemple sur cette page: vous devez remplacer XSSFWorkbook avec SXSSFWorkbook.

Copié cette réponse de - Vadchen , de ne autre question . Cela a fonctionné pour moi. J'ai juste besoin de remplacer XSSFWorkbook pour SXSSFWorkbook dans le code, comme il l'a dit.

2
Vini

Je pense qu'un JVM 32 bits a un maximum de 2 Go de mémoire. Ce n'est peut-être pas obsolète. Si je comprenais correctement, vous définissez le lanceur -xmx sur Eclipse. Si vous souhaitez augmenter la mémoire du programme que vous exécutez à partir d'Eclipse, vous devez définir -xmx dans les "configurations d'exécution de l'exécution ..." (sélectionnez votre classe et ouvrez l'onglet Arguments Mettez-le dans le VM Zone d'arguments) Menu, et pas sur la startup Eclipse

EDIT: Détails que vous avez demandé. à Eclipse 3.4

1) Run-> Exécuter des configurations ...

2) Si votre classe n'est pas répertoriée dans la liste de gauche dans la sous-arbitre "Application Java", cliquez sur "Nouvelle configuration de lancement" dans le coin supérieur gauche

2b) à droite, onglet "Main" Assurez-vous que le projet et la classe sont les bons

3) Sélectionnez l'onglet "Arguments" à droite. Celui-ci a deux zones de texte. L'une est destinée aux arguments de programme qui entrent dans le tableau ARGS [] fourni à votre méthode principale. L'autre est pour les arguments VM. Mettez dans celui avec les arguments VM (Basse-One IIRC), ce qui suit: -XMX2048M

Je pense que 1024 m devrait être plus que suffisant pour ce dont vous avez besoin!

4) Cliquez sur Appliquer, puis cliquez sur Exécuter

Au cas où il fonctionne toujours hors de l'espace de tas, vous pouvez toujours modifier le nombre à une valeur supérieure, par exemple, vous pouvez mettre -xmx4g qui ajoute de 2 gigaoctets à 4 gigaoctets

2
Ramin

Augmentez la taille du tas comme tel:

-XMS256M -XMX512M -XX: Permsize = 64M -XX: maxpermsize = 1000m

Ces valeurs doivent être fournies à la VM.

Jetez un coup d'œil au lien avec lequel cela devrait vous aider à sortir

http://www.javabeat.net/tips/192-javalangoutofMemoryError-java-heap-space.html

1
harishtps