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

Java Discussion :

[Perf]java.lang.OutOfMemoryError - liste trop grande


Sujet :

Java

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 154
    Par défaut
    Tu devrais aussi essayer de le lancer hors eclipse. Vu qu'eclipse bouffe pas mal de ressources, ca sera déjà ca de libéré.

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Par défaut
    Citation Envoyé par Tiaps
    Tu devrais aussi essayer de le lancer hors eclipse. Vu qu'eclipse bouffe pas mal de ressources, ca sera déjà ca de libéré.
    c'est fait ! j'ai même mis du temps à trouver l'endroit où on spécifie la taille de la mémoire, sous tomcat5 (même si c'était juste sous mon nez), donc hors eclipse. Dans les configurations,

    "Initial memory pool"
    et "maximum memory pool"

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Par défaut
    Citation Envoyé par NGY
    Et ouic'est pas trop un problème de temps, mais plutôt de taille mémoire. D'ailleurs souvent, l'amélioration de l'un est aux dépends de l'autre.

    Bon en regardant (rapidement, j'ai pas beaucoup de temps !) ton code n'a pas l'air de trop "gaspiller" de mémoire, alors je ne sais pas trop.

    Par contre, essaie de mieux découper ton code. Tu devrais faire une méthode genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Struct ligneToStruct(String uneLigne) throws LesExceptionsQuiVontBien
    et tu l'appelles dans ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      while ((aLine = in.readLine()) != null) {
        theList.add( ligneToStruct(aLine) );
      } //while ((aLine = in.readLine()) != null)
    Ce sera plus lisible et plus facile à maintenir.
    [Potentiellement n'importe quoi]Et ça jouera peut-être sur la mémoire (plus de variables locales, donc libération moins tardive).[/Potentiellement n'importe quoi]

    j'ai une autre question, niveau perf. Ngy me conseil d'essayer ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Struct ligneToStruct(String uneLigne) throws LesExceptionsQuiVontBien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      while ((aLine = in.readLine()) != null) {
        theList.add( ligneToStruct(aLine) );
      } //while ((aLine = in.readLine()) != null)

    Donc en fait, mon code ressemblerai à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      while ((aLine = in.readLine()) != null) {
    try{
        theList.add( ligneToStruct(aLine) );
    }catch(LesExceptionsQuiVontBien e){}
      } //while ((aLine = in.readLine()) != null)
    Car en fait, je ne vais pas ajouter toutes les lignes systematiquement ... il y a quand même un petit critère de sélection.

    Donc, ma question c'est :

    Le fait de faire "try-catch" pour chaque ligne lue, ça ne va pas ralentir considérablement le processus ? Vous allez me dire "essaye et tu verras". Ouai ouai, j'essayerai, mais ça me passe dans la tête, juste maintenant .. si j'ai la motive, j'essayerai. Mais demain, là j'ai le cerveau en ebullition.

  4. #24
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Une solution possible est de traiter toutes tes données via une application java qui te transforme tes données en XML avec une structure bien établie.
    L'application java peut mettre 2 jours si elle veut, l'important c'ets les données XML qui en resortent.
    Ensuite tu crées des fichiers XSLT, qui mis en relation avec ton XML, affichent tes données par triages, filtres, etc...juste grâce à Internet Explorer 6.0.

    C'était mon projet de stage de fin de Licence et ça marchait bien...

  5. #25
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par laurent.c123
    Le fait de faire "try-catch" pour chaque ligne lue, ça ne va pas ralentir considérablement le processus ? Vous allez me dire "essaye et tu verras". Ouai ouai, j'essayerai, mais ça me passe dans la tête, juste maintenant .. si j'ai la motive, j'essayerai. Mais demain, là j'ai le cerveau en ebullition.
    Le try-catch en lui même ne devrait pas trop ralentir le processus...
    Par contre c'est la création des Exceptions qui risque de le ralentir. En effet lorsque on crée une exception, la méthode fillInStackTrace() est automatiquement exécuté pour initialiser le stack trace de l'exception. Or ceci est très couteux... A la rigueur ti peux surcharger cette méthode afin qu'elle ne fasse rien si tu n'a pas besoin du stacktrace...


    Pour revenir à ton problème de mémoire...
    Le code de ta classe semble correct (mis à part la classe 'Structure' qui possède des champs public...)
    Mais j'ai deux trois questions sur son utilisation :
    • Quand utilises-tu la méthode parseLog() ?
      Que fais-tu de la liste ?
      Comment est-ce que tu la tris ?
      Comment tu l'affiches ?



    a++

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Par défaut
    Salut adiGuba !

    Alors ma méthode parseLog(), je l'utilise une fois, dans la méthode perform() d'une classe dérivant de org.apache.struts.action.Action (je fais du Struts):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public ActionForward perform(ActionMapping arg0, ActionForm arg1,
    			HttpServletRequest arg2, HttpServletResponse arg3)
    			throws IOException, ServletException
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List theList=algos.parseLog(conf.pathLogs+form.getFile(),form.getAccount(),form.getSurvey(),queryList);
    Ensuite j'exporte cette liste afin qu'elle soit utilisable dans une page JSP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    arg2.setAttribute("theList",theList);
    Pour l'afficher dans ma page JSP, j'utilise une librairie de tag, qui se nomme struts-layout

    J'ai juste à faire ça, et ça affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <layout:pager maxPageItems="<%=conf.getResParPage()%>"  sessionPagerId="tableau" >
    	<layout:collection name="theList" styleClass="FORM" id="theTab" >
    <layout:collectionItem  title="Date" property="date" sortable="true" />
    		<layout:collectionItem  title="Heure" property="heure" sortable="true"/>
    		<layout:collectionItem  title="IP" property="ip" sortable="true"/>
    		<layout:collectionItem  title="Compte" property="compte" sortable="true"/>
    		<layout:collectionItem  title="Enquete" property="enquete" sortable="true"/>
    		<layout:collectionItem  title="Requete" property="query" sortable="true"/>
    		<layout:collectionItem  title="Ref" property="ref" sortable="true" />
    		<layout:collectionItem  title="Page" property="page" sortable="true"/>
    		<layout:collectionItem  title="Pages" property="pages" sortable="true"/>
    		<layout:collectionItem  title="Clé" property="key" sortable="true"/>
    		<layout:collectionItem  title="Variables" property="variable" sortable="true" filter="false"/>
    		<layout:collectionItem  title="Paramètres" property="parametre" sortable="true" filter="false"/>
    </layout:collection>
    </layout:pager>
    Le fait d'ajouter sortable="true" ajoute un lien dans la colonne qui permet de trier, selon la colonne, et ce n'est pas moi qui trie cette liste, l'implémentation a déjà été faite par struts-layout.

    Petite question, tu me dis que ma Structure possède des champs publics ..... qu'est ce que ça fait de mal ?

    Voilà voilà ..... @+

    Laurent

  7. #27
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par laurent.c123
    Le fait d'ajouter sortable="true" ajoute un lien dans la colonne qui permet de trier, selon la colonne, et ce n'est pas moi qui trie cette liste, l'implémentation a déjà été faite par struts-layout.
    Est-ce que le liens rappelle la même page JSP ???
    Dans ce cas il faudrait peut-être stocker la liste dans le scope session (sans oublier de la 'supprimer' lorsqu'on n'en as plus besoin...) afin d'éviter d'avoir à charger le fichier à chaque trie de la liste...
    A moins que les fichiers doivent obligatoirement être rechargés à chaque fois (par ex. s'ils changent régulièrement).


    Citation Envoyé par laurent.c123
    Petite question, tu me dis que ma Structure possède des champs publics ..... qu'est ce que ça fait de mal ?
    Ce n'est pas très 'Orienté Objet' mais plutôt 'procédurial'... Généralement les champs d'une classes sont protected voir private afin que n'importe qui ne puisse pas y accéder directement...
    On utilise normalement des 'accesseurs' pour accéder aux champs d'une classe. Par exemple, pour le champs ip on utilisera les méthodes setIp(String) et getIP()...
    Mais dans ton cas le champs public est peut-être requis par struts-layout (que je ne connais pas...)

    a++

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Par défaut
    Ce n'est pas très 'Orienté Objet' mais plutôt 'procédurial'... Généralement les champs d'une classes sont protected voir private afin que n'importe qui ne puisse pas y accéder directement...
    On utilise normalement des 'accesseurs' pour accéder aux champs d'une classe. Par exemple, pour le champs ip on utilisera les méthodes setIp(String) et getIP()...
    Mais dans ton cas le champs public est peut-être requis par struts-layout (que je ne connais pas...)
    C'est vrai, je comprend que ce n'est pas très clean niveau POO, mais c'est juste que j'vais pas besoin d'une telle méthode (set) dans cet objet, donc j'ai préféré accéder directement aux variables plutôt que d'appeler une méthode. Mais bon, celà dit, j'ai quand même rajouté les méthodes set, et j'ai passé les variables en private, pour que ce soit plus clean

    struts-layout n'a pas besoin des variables publiques, il lui faut juste des méthodes get.

  9. #29
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par laurent.c123
    mais c'est juste que j'vais pas besoin d'une telle méthode (set) dans cet objet, donc j'ai préféré accéder directement aux variables plutôt que d'appeler une méthode.
    C'est justement

    Citation Envoyé par laurent.c123
    mais c'est juste que j'vais pas besoin d'une telle méthode (set) dans cet objet, donc j'ai préféré accéder directement aux variables plutôt que d'appeler une méthode.
    Justement ! Ce n'est pas parce que tu n'en a pas besoin aujourd'hui que tu n'en aura jamais besoin...
    Imagines qu'une fois que ton appli est fini, on te demande de rajouter une contrainte sur un des champs, par exemple une limite de 20 charactères maximums, et ainsi de 'couper' la vlauer du champs s'il est plus long : il faudra que tu modifies toutes les affectations de ce champs partout dans ton code. Bien sûr si ta classe n'est pas très utilisé cela ne sera pas bien long... mais si ta classe est beaucoups utilisé par plusieurs développeurs différents là ca se complique...

    De plus, la différence entre l'accès direct et via un accesseur simple (qui renvoi/modifie directement le champs) n'est pas très important... Il faut vraiment faire un très grand nombre d'accès pour sentir une différences...

    A la rigueur tu peux toujours mettre ces accesseurs en final. Dans ce cas il ne pourraont plus être surchargée dans les classes filles mais l'accès sera encore un peu plus rapide (la JVM n'a pas besoin de vérifier le type exact de la classe pour appeller la bonne méthode...)

    a++

    PS : Montres nous deux-trois ligne du format de tes fichiers en entrée qu'on puisse faire quelques tests...

  10. #30
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Par défaut
    Comme tu me l'as demandé, voici trois lignes d'un fichier Log que j'analyse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    200	26/05/05 00:02:22	83.70.73.233	/nitl/travelsurveydit/travelsurveydit.hyp	lang=EN&query=input&java=0/&ref=61K5	18833	266
    ...
    (1 ligne commence par un nombre ..... ici, l'affichage revient automatiquement à la ligne, ce qui coupe ma ligne)

    [edité par adiGuba]

  11. #31
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    J'ai supprimé les 2 lignes de ton code car elles 'cassaient' l'affichage du forum...
    La première suffit pour le principe...


    J'ai testé ta méthode parseLog(). Chez moi elle met environ 3s pour un fichier de 15 Mo... ce qui me parait correct. Il y a quand même plus de 123 000 éléments...

    Sinon pourquoi est-ce que tu utilises un LinkedList ? En effet je ne sais pas comment fonctionne le tri de struts-layout, mais s'il accède aux éléments de la liste par leurs index ca risque d'être très long avec LinkedList, car il faut parcourir tous les éléments précédents pour accéder un élément selon son index... Dans ce cas une ArrayList serait mieux indiqué.

    Enfin, est-ce que struts-layout rappelle la même page pour faire un tri ?
    Dans ce cas il serait peut-être mieux de stocker la liste dans le scope session voir application (selon ton utilisation) afin d'éviter d'avoir à le regénérer (et ainsi éviter de multiple construction/destruction d'objet...)

    Par contre je me demande vraiment l'intéret d'envoyer autant de données sur une page web (puisque apparement il s'agit d'une application web)...

    a++

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Par défaut
    Salut !
    Pourquoi j'utilise LinkedList ? Et bien parceque justement, je n'y accède à aucun moment par les indices, que par des itérateurs. Je ne sais pas du tout comment itère Struts-Layout, mais pour être plus prudent, je peux peut etre transformer en ArrayList. D'ailleur, c'est pour pouvoir changer facilement que j'ai déclaré des "List".

    L'interet de ce truc là ? Heu, ben, ..... un Log correspond à une journée d'activité, et on (enfin les gars de la boîte) a besoin dans certaines circonstances d'analyser un fichier entier, pour trouver des éventuelles erreures .....

  13. #33
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Par défaut
    Bon, en augmentant le Heap, je l'ai passé à 512Mo maximum, ça résoud quand même pas mal de choses, donc j'ajoute la balise [ Résolu ].
    Cela dit, toutes vos réponses m'ont bien permi d'optimiser pas mal mon code.
    Merci à tous pour vos conseils.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/09/2006, 10h02
  2. Eclipse erreur : java.lang.OutOfMemoryError: Java heap space
    Par sderecourt dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 14/04/2006, 11h28
  3. [webService][Axis] java.lang.OutOfMemoryError
    Par webspeak dans le forum Services Web
    Réponses: 8
    Dernier message: 25/04/2005, 17h58
  4. [Strategie]Pb de java.lang.OutOfMemoryError
    Par eaque dans le forum Général Java
    Réponses: 3
    Dernier message: 06/04/2005, 11h01
  5. [JSP] pb " java.lang.outOfMemoryError "
    Par lthomas dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 31/03/2005, 10h13

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