java.lang.OutOfMemoryError: espace de tas Java en lisant Excel avec POI Apache
Mon fichier est 9MB et j'ai eu cette erreur pendant le chargement du classeur.
XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath);
cette ligne provoque de java.lang.OutOfMemoryError: Java heap space
Comment puis-je résoudre ce problème?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Je pense segment par défaut est la taille de 128M
Vous pouvez l'augmenter à l'aide de la
-Xmx
argument javapar exemple
Première chose à vérifier - vous de l'ouverture de la XSSFWorkbook avec un InputStream ou un Fichier? En l'ouvrant avec un Fichier est beaucoup plus faible mémoire.
Prochaine, voulez-vous de lire ou d'écrire? Si la mémoire est très serré pour vous, il existe d'autres options pour l'utilisation de XSSF dans un sax.
Pour la lecture, voir http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api pour les détails de l'utilisation de XSSF: + Sax. Comme autre option, si vous voulez juste pour obtenir le contenu textuel du fichier, il ressemble à Apache Tika a un événement à partir du texte de l'extracteur .xlsx fichiers à l'aide de POI.
Pour l'écriture, il y a eu beaucoup de discussions sur la POI dev liste récemment au sujet de l'amélioration de la "Grande Grille de Démonstration". Vous pouvez suivre ceux - http://poi.apache.org/mailinglists.html
Comme suggéré par d'autres, la première chose à faire est d'augmenter la taille du tas.
Si cela n'aide pas ou vous attendez plus de fichiers, vous devriez aussi jeter un oeil à cette réponse: Le traitement de grandes xlsx fichier en Java
Elle donne quelques bons points de départ, sur ce qui peut être fait si la norme "tout lire" mode ne fonctionne pas pour vous.
Je pense qu'un 32 bits JVM a un maximum de 2 go de mémoire.Ce pourrait être hors de date. Si j'ai bien compris, vous définissez la -Xmx sur Eclipse lanceur. Si vous souhaitez augmenter la mémoire pour le programme que vous exécutez à partir d'Eclipse, vous devez définir-Xmx dans le "Exécuter->Run configurations..."(sélectionnez votre classe et ouvrez l'onglet Arguments de la mettre dans la VM arguments de la zone de menu, et non PAS sur l'Éclipse de démarrage
Edit: les détails que vous avez demandé. dans Eclipse 3.4
1) Exécuter->Run Configurations...
2) si votre classe n'est pas répertorié dans la liste sur la gauche dans la "Java Application" de la sous-arborescence, cliquez sur "Nouvelle configuration de Lancement" dans le coin supérieur gauche
2b), sur la droite, onglet "essentiel" assurez-vous que le projet et la classe sont les bonnes
3)sélectionnez "Arguments" onglet sur la droite. celui-ci dispose de deux zones de texte. l'une est pour le programme de arguments qui de la args[] tableau fourni à votre méthode principale. l'autre est pour la VM arguments. mettre dans une avec la VM arguments(un en bas iirc) suivantes:
-Xmx2048m
Je pense que 1024m devrait plus que suffisant pour ce que vous avez besoin si!
4)Cliquez sur Appliquer, puis Cliquez sur Exécuter
Dans le cas où il s'exécute toujours pas de mémoire que vous pouvez encore changer le nombre à une valeur plus élevée, par exemple, vous pouvez mettre -Xmx4g, qui s'ajoute à partir de 2 go à 4 Gigaoctets
Augmentation de la taille du tas en tant que tel:
Ces valeurs doivent être fournies à la machine virtuelle.
Prendre un coup d'oeil sur le lien, cela devrait vous aider
http://www.javabeat.net/tips/192-javalangoutofmemoryerror-java-heap-space.html
Lors de l'écriture de gros fichiers:
Ce que vous avez besoin est SXSSF (Streaming Usermodel API).
Il y a un exemple sur cette page: vous avez besoin de remplacer
XSSFWorkbook
avecSXSSFWorkbook
.Copié cette réponse de vadchende une autre question. Il a travaillé pour moi. J'ai juste besoin de remplacer
XSSFWorkbook
pourSXSSFWorkbook
dans le code, comme il l'a dit.