Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1359 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Java] Problème de taille mémoire avec un JTree

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Java] Problème de taille mémoire avec un JTree

n°816015
fb@alphalo​g
Posté le 05-08-2004 à 15:19:55  profilanswer
 

bonjour,  
je suis en train de faire un explorateur de fichier java sur la base d'un JTree avec els modifications suivants :

  • chaque noeud de l'arbre contient une JCheckBox ( comme expliqué dans cette méthode )
  • chacun de mes noeud herite de DefaultMutableTreeNode avec deux variables d'instances supplementaire : un File et un long  


avec tout ca , mon appli s'arrete des que j'atteint les 42 000 noeuds ( pour une utilisation mémoire de pres de 80 Mo )  
y a t il un moyen de faire baisser cette utilisation ?  
 
:jap:
 
 
EDIT : correction de la taille memorie


Message édité par fb@alphalog le 05-08-2004 à 16:07:50
mood
Publicité
Posté le 05-08-2004 à 15:19:55  profilanswer
 

n°816024
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 15:22:41  profilanswer
 

c normal, tu stockes les objets dans tes arbres..donc il fait la même taille que ton fs...crée un wrapper dont la méthode toString renvoit le nom du fichier, wrapper contenant uniquement le chemin de l'objet...le wrapper pèsera peanuts, et tu pourra en mettre bcp plus...


---------------
Jubi Photos : Flickr - 500px
n°816028
fb@alphalo​g
Posté le 05-08-2004 à 15:23:18  profilanswer
 

ok , je teste de suite  

n°816031
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 15:25:48  profilanswer
 

hum, que contient ton File ? (donne un exemple de DefaultMutableTreeNode)
 
je pense avoir dit une connerie : si t'a qu'un file, t'a que la référence au fichier : tant que tu l'a pas chargé, il pèse rien...
 
sinon t'a essayé de mettre un paramètre à java pour qu'il t'alloue plus de mémoire pour l'application ?


---------------
Jubi Photos : Flickr - 500px
n°816042
fb@alphalo​g
Posté le 05-08-2004 à 15:35:51  profilanswer
 

je viens de tester  et ca ne amrche pas mieux avec des string : je viens de me faire la meme reflexion  
 
voici le debut de ma classe MyTreeNode :  

Code :
  1. public class MyTreeNode extends DefaultMutableTreeNode{
  2.   private File fichier=null;
  3.   private int etat;
  4.   private long size;
  5.   public MyTreeNode(Object userObject,File fichier, boolean allowsChildren) {
  6.     super(userObject,allowsChildren);
  7.     this.fichier = fichier;
  8.     etat =  0;
  9.     size=0;
  10.   }


 et j'appelle ce constructeur de la maniere suivante :

Code :
  1. private MyTreeNode getSubDirs(File f) {
  2.     String name="";
  3.     if(f.getName().equals("" )){
  4.       name = f.toString();
  5.       System.err.println("je rentre dans getSubDirs a une racine "+name);
  6.     }
  7.     else
  8.       name= f.getName();
  9.     MyTreeNode mtn = new MyTreeNode(new JCheckBox(name),f, true);
  10.    
  11.     if (f.isFile()){
  12.       mtn.setSize(f.length());
  13.       return mtn;
  14.     }
  15.     File[] listeSousRep = f.listFiles();
  16.     if (listeSousRep != null) {
  17.       for (int i = 0; i < listeSousRep.length; i++) {
  18.         if(listeSousRep[i].isHidden())
  19.           continue;
  20.         MyTreeNode noeud = getSubDirs(listeSousRep[i]);
  21.         mtn.add(noeud);
  22.       }
  23.     }
  24.     return mtn;
  25.   }
  26. }


 
je n'ai pas encore forcer la JVM a prendre plus de  memoire que par defaut
mais je prefererais eviter , vu qu' a terme je avis avoir a peu pres 5 a 10 fois plus de fichiers a mettre dnas l'arbre :/


Message édité par fb@alphalog le 05-08-2004 à 15:36:43
n°816046
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 15:39:10  profilanswer
 

et la taille de la VM ???
 
j'ai jamais les paramètres en tete, c -Xms ou qqc comme ca
 


---------------
Jubi Photos : Flickr - 500px
n°816049
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 15:41:33  profilanswer
 

40000 / 4 000 000 = 0.01 ce qui fait 10ko par objet...ca me semble gros...
 
-->tu peux pas mettre moins de chose dans le treenode ?


---------------
Jubi Photos : Flickr - 500px
n°816051
fb@alphalo​g
Posté le 05-08-2004 à 15:44:45  profilanswer
 

difficile : le aprametre size est tres long a recalculer dans le cas d'un repertoire , donc je suis obliger de le stocker  
et l'int etat fait parti de l'algo  
 
de toute maniere avec ces deux champs , ont ne doit pas arriver a plus de 10 octets / noeuds

n°816058
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 15:49:36  profilanswer
 

je me demande si c pas la récursivité qui te bouffe tt la ram...
 

Code :
  1. File[] listeSousRep = f.listFiles();
  2.         if (listeSousRep != null) {
  3.             for (int i = 0; i < listeSousRep.length; i++) {
  4.                 if(listeSousRep[i].isHidden())
  5.                     continue;
  6.                 MyTreeNode noeud = getSubDirs(listeSousRep[i]);
  7.                 mtn.add(noeud);
  8.             }
  9.         }


 
si par ex t'a un rep qui contient 10 rep dont chacun contient 10 rep dont chacun contient 10 fichiers, ca te fait déjà 1000 passages...dans un FS ca doit etre pire...
 
tu devrais foutre cette méthode hors du TreeSet, elle devrait même pas etre dans le dispatchEvent de Swing...


Message édité par Jubijub le 05-08-2004 à 15:53:02

---------------
Jubi Photos : Flickr - 500px
n°816066
fb@alphalo​g
Posté le 05-08-2004 à 15:53:14  profilanswer
 

si j'ai un rep qui contient 10 sous repertoire
et que chacun de ces repertoires contient 10 fichiers , j'arrive a 111 appels de procedures ( 1 pour la racine, 10 pour les rep et 10*10 pour les fichiers ) ,non  ?
soit autant que de fichier
 
je peux difficielement passer en dessosu
 
de plus j'ai verifié ,je ne descends pas trop profond , donc  le cout de la recursivité est assez faible , meme si je vais quand meme tenter uen version derecursivée

mood
Publicité
Posté le 05-08-2004 à 15:53:14  profilanswer
 

n°816070
fb@alphalo​g
Posté le 05-08-2004 à 15:54:34  profilanswer
 

Jubijub a écrit :


tu devrais foutre cette méthode hors du TreeSet, elle devrait même pas etre dans le dispatchEvent de Swing...


 
tu peux detailler ?  
de totue maniere cette methode est static , je l'ai juste mise dans la classe de declaration de mon arbre pour simplfier le debuggage (avoir acces a l'arbre ainsi qu'au nombre de noeud )

n°816077
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 16:01:32  profilanswer
 

Swing est monothreadé...donc tt opération ayant lieu dans swing est mise à la file dans une pile, et y'a qu'une seule thread qui la traite...si une opération prend 10 secondes à se réaliser, ta GUI est morte pendant 10 secondes (rien d'autre ne pourra se faire...)
 
c pe pas la raison du pb, mais c un pb que tu va avoir...le parsing que tu fais est lent par nature (il y a une question d'IO derrière)...donc pendant tt le temps de construction de ton arbre, ton appli est morte, tu peux te faire un café...
 
en relisant je vois que j'ai dit plein de conneries :D ...
 


---------------
Jubi Photos : Flickr - 500px
n°816081
fb@alphalo​g
Posté le 05-08-2004 à 16:04:08  profilanswer
 

ok, mais c c pas grave  
j'ai le temps ( c meme la seule chose qe j'ai pour cette appli :D)  
mais je penserai soit a faire un thread en background pour la construction de l'arbre , soit un splash screen

n°816085
fb@alphalo​g
Posté le 05-08-2004 à 16:07:26  profilanswer
 

je viens de m'apercevoir que si je vire les JCheckbox , je passe a 29 Mo pour 42 000 noeud  
alors que je suis a presque 80 Mo avec ( je viens de refaire un pointage de l'utilisation memoire )  
il faut que je trouve qq hoe de moins gourmand que les JCheckbox , mais d'aussi pratique

n°816088
nerisson
Pic-pic
Posté le 05-08-2004 à 16:08:32  profilanswer
 

Et si tu ne parsait que les repertoires qui sont affichés à l'écran, sans descendre dans tout les sous répertoires ?
Comme ca tu utilisera trés peu de mémoire, juste le necessaire à l'affichage.
Et puis lorsque l'utilisateur clique sur un noeud pour voir les sous repertoires a ce moment la tu cree tes objets.


---------------
Light is right
n°816091
fb@alphalo​g
Posté le 05-08-2004 à 16:10:48  profilanswer
 

mais l'appli plantera des que l'utilisateur cliquera sur develloper tout :(

n°816094
nerisson
Pic-pic
Posté le 05-08-2004 à 16:11:04  profilanswer
 

fb@alphalog a écrit :

je viens de m'apercevoir que si je vire les JCheckbox , je passe a 29 Mo pour 42 000 noeud  
alors que je suis a presque 80 Mo avec ( je viens de refaire un pointage de l'utilisation memoire )  
il faut que je trouve qq hoe de moins gourmand que les JCheckbox , mais d'aussi pratique


Tu peut faire un pool d'objets JCheckBox pour resoudre ce problème


---------------
Light is right
n°816096
nerisson
Pic-pic
Posté le 05-08-2004 à 16:12:05  profilanswer
 

fb@alphalog a écrit :

mais l'appli plantera des que l'utilisateur cliquera sur develloper tout :(


Arf...
Ben supprime cette fonctionnalitée :D  
Qui a envie de voir 42000 fichiers ?


---------------
Light is right
n°816098
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 16:12:37  profilanswer
 

-->privilégie le thread pour la construction de l'arbre (le splash c pour les faibles :D )
 
---> c clair que foutre un composant swing dans un node t'a le moral...surtout une checkbox je vois pas l'intéret : tu peux faire une sélection mutliple sur les noeuds d'un arbre (faut refaire le selectionListener, mais c possible)


---------------
Jubi Photos : Flickr - 500px
n°816100
fb@alphalo​g
Posté le 05-08-2004 à 16:13:11  profilanswer
 

c'est a dire ?  
qu'est ce que tu veux dire par un "pool" de JCheckbox : je borne l nombre max d eJCheckBox affichable ?

n°816102
fb@alphalo​g
Posté le 05-08-2004 à 16:14:36  profilanswer
 

il me faut des CheckBox ( cahier des charges  ) pour pouvoir selectionner des fichier ( un peu comme pour emule lors du parametrage des fichiers partagés ) , donc je peux difficielement passer outre

n°816103
nerisson
Pic-pic
Posté le 05-08-2004 à 16:15:54  profilanswer
 

fb@alphalog a écrit :

c'est a dire ?  
qu'est ce que tu veux dire par un "pool" de JCheckbox : je borne l nombre max d eJCheckBox affichable ?


Tu cree uniquement 2 instances de JCheckBox, une à l'état cochée, l'autre décochée.
Ensuite tu dans ton renderer tu retourne l'une ou l'autre instance en fonction de l'état qui doit être affiché, mais tu ne créé rien comme objet.


---------------
Light is right
n°816114
fb@alphalo​g
Posté le 05-08-2004 à 16:20:50  profilanswer
 

nerisson a écrit :

Tu cree uniquement 2 instances de JCheckBox, une à l'état cochée, l'autre décochée.
Ensuite tu dans ton renderer tu retourne l'une ou l'autre instance en fonction de l'état qui doit être affiché, mais tu ne créé rien comme objet.


 
ca semble etre une tres bonne idée
 
si j'ai ben compris , la méthode getTreeCellEditorComponent me retourne le component ( dans mon cas une JCheckBox ) lors de la premiere selection d'un noeud  
c'est ca ?  
 
est ce que ca ne vas pas ensuite etre complique de lié l'etat de la checkbx a mon noeud ?

n°816129
nerisson
Pic-pic
Posté le 05-08-2004 à 16:31:22  profilanswer
 

Ben fais voir le code du corps de ta méthode, apparement tu dois créer un renderer pour chaque noeud non ?
Et il sera peut etre preferable de separer tes 2 variables File et long pour les mettres dans un autre objet. Dans cet autre objet tu rajoutes un boolean pour dire si la checkbox doit etre cochée ou non.
Ensuite dans ton renderer tu regarde la valeur du boolean et tu retournes l'une des 2 instances de JCheckBox.


---------------
Light is right
n°816133
fb@alphalo​g
Posté le 05-08-2004 à 16:35:15  profilanswer
 

c'est exactement ca , je cree un rendreere pour chaque noeud  
ou plutot je cree une JCheckbox par noeud , que je retourne comme renderer
 
 

n°816138
nerisson
Pic-pic
Posté le 05-08-2004 à 16:38:05  profilanswer
 

fb@alphalog a écrit :

c'est exactement ca , je cree un rendreere pour chaque noeud  
ou plutot je cree une JCheckbox par noeud , que je retourne comme renderer


Pas bien !  :)  
Ben essaye de faire comme je t'ai dis, c'est plus compliqué à coder mais tu vas utiliser beaucoup moins de mémoire en faisant comme ca puisque en fait tu va remplacer un objet JCheckBox par un boolean pour chaque noeud.


---------------
Light is right
n°816147
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 16:46:23  profilanswer
 

je suis d'accord avec nerisson : moins tu stockes dans chaque node, moins ce sera le bordel


Message édité par Jubijub le 05-08-2004 à 16:46:41

---------------
Jubi Photos : Flickr - 500px
n°816149
fb@alphalo​g
Posté le 05-08-2004 à 16:47:09  profilanswer
 

vi , mais c vachement plus simple a coder :D
 
bon, je viens de tester , et j'ai une JCheckbox qui apparit quand je selectionne le noeud ,mais elle disparait des que j'en deselectionne un autre
 
la solution que je vais essayer de mettre en place :
a chaque noeud un JCheckBox que je cree uniquement si l'utilisateur fait un expand , et que je detruit a chaque collapse

n°816152
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 16:48:12  profilanswer
 

note que c compatible avec mon idée de wrapper du début (sauf qu'en fait c ton node qui devient le wrapper) : tu stockes par référence, et pas par copie...


---------------
Jubi Photos : Flickr - 500px
n°816154
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 16:49:26  profilanswer
 

fb@alphalog a écrit :

vi , mais c vachement plus simple a coder :D
 
bon, je viens de tester , et j'ai une JCheckbox qui apparit quand je selectionne le noeud ,mais elle disparait des que j'en deselectionne un autre
 
la solution que je vais essayer de mettre en place :
a chaque noeud un JCheckBox que je cree uniquement si l'utilisateur fait un expand , et que je detruit a chaque collapse


 
c de la lazy instanciation...c effectivement plus clean pour ton usage...


---------------
Jubi Photos : Flickr - 500px
n°816155
nerisson
Pic-pic
Posté le 05-08-2004 à 16:50:40  profilanswer
 

Poste un bout de code.
A mon avis tu as juste fait le pool de JCheckBox sans rajouter une variable boolean pour savoir quel JCheckBox afficher.


---------------
Light is right
n°816157
fb@alphalo​g
Posté le 05-08-2004 à 16:51:14  profilanswer
 

bon,je vais donc utiliser un TreeWillExpandListener

n°816158
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 16:52:31  profilanswer
 

oui...y'a du code dans le javatutorial si ca t'intéresse


Message édité par Jubijub le 05-08-2004 à 16:52:45

---------------
Jubi Photos : Flickr - 500px
n°816161
fb@alphalo​g
Posté le 05-08-2004 à 16:58:51  profilanswer
 

je crois que l'ai sous les yeux ( celui ou une popup demande si on veut bien fare un expand ? )

n°816176
pascal34
one point !
Posté le 05-08-2004 à 17:27:19  profilanswer
 

Faut faire gaffe avec seulement 2 JCheckbox.
Comment ça fonctionne pour le libellé d'un noeud de l'arbre si le TreeCellRenderer renvoie une des deux instances de JcheckBox ? le libelle du noeud sera le libelle du JCheckBox
 
Normalement, le libellé d'un noeud de l'arbre correspond au libellé du JLabel renvoyé par le DefaultTreeCellRenderer

n°816205
fb@alphalo​g
Posté le 05-08-2004 à 18:03:17  profilanswer
 

d'ou la solution de lazy instanciation que j'utilise ( pour ne pas bouffer tro pde ram , mais pour afficher toutes les JCheckBox )  
 
surtout qu'histoire de bouffer encor un peu plus de ram , els JLabel des JCheckBox contiennent une icone :pt1cable:

n°816209
Taz
bisounours-codeur
Posté le 05-08-2004 à 18:13:39  profilanswer
 

je vais dire une connerie, mais dans tout ça, t'as pas trouvé un endroit pour placer un flyweight pattern bien senti ?

n°816211
fb@alphalo​g
Posté le 05-08-2004 à 18:22:26  profilanswer
 

je ne sais pas ce qu'est un flyweight pattern  
(search in progress ... )

n°816238
Jubijub
Parce que je le VD bien
Posté le 05-08-2004 à 19:20:16  profilanswer
 

intéressant ce pattern...
 


---------------
Jubi Photos : Flickr - 500px
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Java] Problème de taille mémoire avec un JTree

 

Sujets relatifs
problème avec for_eachProblème en visual basic - TabOrder --> Résolu
[JAVA] regex, pattern, matcher et group sont dans un bateauProblème d'accès ODBC (ACCES+ORACLE)
probleme configurartion serveur apache pour phpBouquins references pour debuter en JAVA
[VBS/VBA] Probleme avec after et before ds un vbs[ASM] Optim : précalcul en mémoire ou calcul sur registres ?
Probleme pour l'exécutionproblème de menu flash avec url +arguments en PHP
Plus de sujets relatifs à : [Java] Problème de taille mémoire avec un JTree


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR