Bonjour à tous,
Depuis deux jours je suis confronté à une erreure OutOfMemomryError lors de l'appel de la méthode setText() d'un JTextPane (voir exemple simplifié ci-dessous).
La variable str est initialisée avec le contenu d'un fichier texte. Je ne développe pas plus le code car cette partie ne pose pas de problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 JTextPane editor; String str; // code de traitement ... editor.setText(str); // code de traitement ...
Seulement, lorsque le fichier ouvert dépasse environ 2Mo, j'obtiens l'erreure OutOfMemoryErreur sur la méthode setText().
J'ai alors fait l'essai de lire le fichier ligne par ligne et d'ajouter les lignes une à une dans le JTextPane. Mais ça n'a strictement rien changé.
Alors après plusieurs recherche sur le net, j'ai modifié la mémoire de la JVM avec la commande -Xmx256. Celà a réglé temporairement mon problème, car lorsque je suis passé à un fichier de 4Mo j'ai de nouveau obtenue l'erreur OutOfMemoryError.
Je pourrais alors passer une commande -Xmx512 à la JVM mais ça repoussera le problème temporairement sans le corriger réellement.
De plus, mon application est censée tournée sur un serveur d'applications ou une multitude de taches tournent en même temps, et je me pose des questions sur les interactions que pourrait donner une telle monopolisation de mémoire. Mais ce n'est pas l'objet de mon message ...
J'ai donc fait un test avec un JTextArea et avec une commande -Xmx128m pour la JVM et un fichier de 4Mo, je n'ai eu aucune erreure. Malheureusement, comme j'ai besoins de "styler" le texte je ne peus pas utiliser cette classe.
Mais ce test me prouve que c'est pas tant la taille du fichier qui apparement pose problème. 2 ou 4Mo ne sont plus de nos jour de grosses quantités de données.
Par contre les fichiers texte que je dois afficher sont particuliers et contiennent énormément de lignes. Ils sont du type :
OBJET1 = TOTO
PARAM1 = XX
...
PARAM20 = YYYYYY
FIN
OBJET2 = TUTU
PARAM1 = ABCD
...
PARAM20 = AZERTY
FIN
...
...
Ce qui représente de l'ordre de 300 000 lignes pour un fichier 4Mo. Et j'ai l'intime conviction que c'est ce nombre de lignes, traité differemment dans un JTextArea et un JTextPane, qui me pose problème.
J'ai l'impression que le JTextArea ne cré qu'une seule instance d'objet pour stocker toutes les lignes, alors que le JTextPane va créer une instance d'objet par ligne. Et en fait mon problème viendrait de l'instanciation de 300 000 objets qui est beaucoup plus gourmand en mémoire.
Pouvez-vous me dire si mon intuition est bonne ou pas ?
Maintenant, que mon intuition soit bonne ou pas, j'aimerais trouver une autre solution technique pour afficher ces fichiers, alors toutes bonnes idées sont les bien venues. Peut être un autre composant que les JTextPane ou JEditorPane ?
En cherchant sur le net, certains forums parlaient de "bufferiser" le fichier et d'afficher dans le JTextPane que le texte pouvant être visualisée et de raffraichir le contenu visible en fonction des déplacements de la barre de défilement du JScrollPane. Mais aucun exemple était proposé et ça me parait assez compliqué. Donc si quelqu'un a déjà testé ou mis en place une telle solution je suis preneur.
Merci d'avance pour vos conseils, astuces ou solutions ...
Partager