Problème de taille mémoire avec un JTree [Java] - Java - Programmation
Marsh Posté le 05-08-2004 à 15:22:41
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...
Marsh Posté le 05-08-2004 à 15:25:48
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 ?
Marsh Posté le 05-08-2004 à 15:35:51
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 :
|
et j'appelle ce constructeur de la maniere suivante :
Code :
|
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
Marsh Posté le 05-08-2004 à 15:44:45
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
Marsh Posté le 05-08-2004 à 15:49:36
je me demande si c pas la récursivité qui te bouffe tt la ram...
Code :
|
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...
Marsh Posté le 05-08-2004 à 15:53:14
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
Marsh Posté le 05-08-2004 à 15:54:34
Jubijub a écrit : |
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 )
Marsh Posté le 05-08-2004 à 16:01:32
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 ...
Marsh Posté le 05-08-2004 à 16:04:08
ok, mais c c pas grave
j'ai le temps ( c meme la seule chose qe j'ai pour cette appli )
mais je penserai soit a faire un thread en background pour la construction de l'arbre , soit un splash screen
Marsh Posté le 05-08-2004 à 16:07:26
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
Marsh Posté le 05-08-2004 à 16:08:32
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.
Marsh Posté le 05-08-2004 à 16:10:48
mais l'appli plantera des que l'utilisateur cliquera sur develloper tout
Marsh Posté le 05-08-2004 à 16:11:04
fb@alphalog a écrit : je viens de m'apercevoir que si je vire les JCheckbox , je passe a 29 Mo pour 42 000 noeud |
Tu peut faire un pool d'objets JCheckBox pour resoudre ce problème
Marsh Posté le 05-08-2004 à 16:12:05
fb@alphalog a écrit : mais l'appli plantera des que l'utilisateur cliquera sur develloper tout |
Arf...
Ben supprime cette fonctionnalitée
Qui a envie de voir 42000 fichiers ?
Marsh Posté le 05-08-2004 à 16:12:37
-->privilégie le thread pour la construction de l'arbre (le splash c pour les faibles )
---> 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)
Marsh Posté le 05-08-2004 à 16:13:11
c'est a dire ?
qu'est ce que tu veux dire par un "pool" de JCheckbox : je borne l nombre max d eJCheckBox affichable ?
Marsh Posté le 05-08-2004 à 16:14:36
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
Marsh Posté le 05-08-2004 à 16:15:54
fb@alphalog a écrit : c'est a dire ? |
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.
Marsh Posté le 05-08-2004 à 16:20:50
nerisson a écrit : Tu cree uniquement 2 instances de JCheckBox, une à l'état cochée, l'autre décochée. |
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 ?
Marsh Posté le 05-08-2004 à 16:31:22
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.
Marsh Posté le 05-08-2004 à 16:35:15
c'est exactement ca , je cree un rendreere pour chaque noeud
ou plutot je cree une JCheckbox par noeud , que je retourne comme renderer
Marsh Posté le 05-08-2004 à 16:38:05
fb@alphalog a écrit : c'est exactement ca , je cree un rendreere pour chaque noeud |
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.
Marsh Posté le 05-08-2004 à 16:47:09
vi , mais c vachement plus simple a coder
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
Marsh Posté le 05-08-2004 à 16:49:26
fb@alphalog a écrit : vi , mais c vachement plus simple a coder |
c de la lazy instanciation...c effectivement plus clean pour ton usage...
Marsh Posté le 05-08-2004 à 16:50:40
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.
Marsh Posté le 05-08-2004 à 16:58:51
je crois que l'ai sous les yeux ( celui ou une popup demande si on veut bien fare un expand ? )
Marsh Posté le 05-08-2004 à 17:27:19
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
Marsh Posté le 05-08-2004 à 18:03:17
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
Marsh Posté le 05-08-2004 à 18:13:39
je vais dire une connerie, mais dans tout ça, t'as pas trouvé un endroit pour placer un flyweight pattern bien senti ?
Marsh Posté le 05-08-2004 à 18:22:26
je ne sais pas ce qu'est un flyweight pattern
(search in progress ... )
Marsh Posté le 05-08-2004 à 15:19:55
bonjour,
je suis en train de faire un explorateur de fichier java sur la base d'un JTree avec els modifications suivants :
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 ?
EDIT : correction de la taille memorie
Message édité par fb@alphalog le 05-08-2004 à 16:07:50