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é.
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 !Envoyé par Tiaps
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"
Envoyé par NGY
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 :
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.
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)
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.
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...
Salut,
Le try-catch en lui même ne devrait pas trop ralentir le processus...Envoyé par laurent.c123
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++
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, ServletExceptionEnsuite j'exporte cette liste afin qu'elle soit utilisable dans une page JSP :
Code : Sélectionner tout - Visualiser dans une fenêtre à part List theList=algos.parseLog(conf.pathLogs+form.getFile(),form.getAccount(),form.getSurvey(),queryList);
Pour l'afficher dans ma page JSP, j'utilise une librairie de tag, qui se nomme struts-layout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 arg2.setAttribute("theList",theList);
J'ai juste à faire ça, et ça affiche :
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.
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>
Petite question, tu me dis que ma Structure possède des champs publics ..... qu'est ce que ça fait de mal ?
Voilà voilà ..... @+
Laurent
Est-ce que le liens rappelle la même page JSP ???Envoyé par laurent.c123
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).
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...Envoyé par laurent.c123
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++
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 cleanCe 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...)
struts-layout n'a pas besoin des variables publiques, il lui faut juste des méthodes get.
C'est justementEnvoyé par laurent.c123
Justement ! Ce n'est pas parce que tu n'en a pas besoin aujourd'hui que tu n'en aura jamais besoin...Envoyé par laurent.c123
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...
Comme tu me l'as demandé, voici trois lignes d'un fichier Log que j'analyse :
(1 ligne commence par un nombre ..... ici, l'affichage revient automatiquement à la ligne, ce qui coupe ma ligne)
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 ...
[edité par adiGuba]
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++
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 .....
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.
Partager