IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

JTextPane : Affichage de gros fichiers texte


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par défaut JTextPane : Affichage de gros fichiers texte
    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).

    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 ...
    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.

    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 ...

  2. #2
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Et l'afficher en plusieurs pages, ça ne pourrait pas jouer ?

    Par exemple ne mettre qu'un certain nombre de lignes, et un bouton "Suivant" pour avoir la suite du texte.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par défaut
    Merci Satch pour ton idée.

    C'est vrai que traiter un affichage par page avec un bouton pour se déplacer est une alternative plus simple. Mais elle me semble moins fonctionnelle aussi.
    Si je fais des pages de 1000 lignes et que l'utilisateur veut accéder à une information paumée au niveau de la 250 000 ème ligne il devra cliquer 250 fois sur "suivant" ou une fois sur "fin" et 50 fois sur "précédent". Pas très pratique ...

    Je crois que ce qu'il me faut c'est effectivement un affichage par page mais en gardant le défilement via la scrollbar. Et là, tu me donnes de nouvelles perspective car je n'avais pas vu un défilement par pages mais par lignes (comme la fonction initiale du JTextPane).

    Un fichier de 300 000 lignes est composée d'environ 4000 objets. Je pourrais très bien dire qu'un objet correspond à une page et donc ainsi faire un défilement et un affichage objet par objet, ce qui reste cohérent point de vue de l'utilisateur.

    Je vais réfléchir à ton idée ...

    Mais toutes autres bonnes idées comme celle-ci sont les biens venues !

    Merci d'avance pour vos propositions ...

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Je dis peut-être une bêtise, à confirmer :
    Il le semble que le mapping du fichier en mémoire pourrait corriger ton problème définitivement. Essais d'initialiser ton JTextPane à partir MappedByteBuffer ( package java.nio ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    FileInputStream fis=new FileInputStream("monFichier");
    FileChannel channel=fis.getChannel();
    int size=(int)channel.size();
    MappedByteBuffer buff=channel.map(FileChannel.MapMode.READ_ONLY,0,size);
    ...

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par défaut
    Merci iohack pour le tuyau !

    Je n'y connais rien en mapping et au package java.nio mais je vais regarder ça de près.

    Je te tiens au courant et te demanderais peut être plus d'infos si je ne m'en sort pas tout seul ...

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par défaut
    iohack,

    Je viens de regarder ton idée et je crois que je n'irai pas très loin avec cette solution pour plusieurs raisons :
    1) je ne peus pas créer le FileInputStream car le texte que je veux afficher ne viens pas d'un fichier mais d'un String.
    2) en cherchant rapidement je n'ai pas touvé un moyen simple de passer le contenu du MappedByteBuffered au JTextPane.
    3) le JTextPane aura toutes les chances de me ressortir l'erreur OUtOfMemoryError à partir du moment ou je lui envoie la même quantitée de donnée.

    Merci quand même pour ton aide ...

Discussions similaires

  1. affichage d'un fichier texte en php
    Par dgac2000 dans le forum Langage
    Réponses: 8
    Dernier message: 23/05/2007, 19h54
  2. Affichage d'un fichier texte dans une fenetre
    Par schwinny dans le forum Access
    Réponses: 3
    Dernier message: 11/08/2006, 08h53
  3. [Ada] Affichage d'un fichier texte
    Par sneb5757 dans le forum Ada
    Réponses: 9
    Dernier message: 12/06/2006, 10h14
  4. [C#]Lecture gros fichier texte
    Par kekesilo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/05/2006, 13h58
  5. [VBA-E]Telecharger un gros fichier texte
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/04/2006, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo