2008-11-12 9 views
2

Cette question concerne un Java JTree ou un arbre Windows .Net (Winforms) ou un arbre Adobe Flex.Le grand arbre: quand publier des données dans un RIA

Dans une application client-serveur (pour Flex c'est Web, vraiment), j'ai un arbre avec des données hiérarchiques (dans une interface de type Windows Explorer). En ce moment, je charge paresseusement l'arbre que l'utilisateur demande plus de données du serveur. C'est très bien et fonctionnera jusqu'à environ 750K nœuds (testés empiriquement sur .Net Winforms et Adobe Flex), mais après ça ça devient lent. Mais les bases de données se développent rapidement (surtout parce que les utilisateurs peuvent coller d'énormes quantités de nœuds) et une base de données de 20 millions de nœuds n'est pas du tout improbable.

Dois-je libérer des données de l'arborescence lorsqu'une branche est réduite afin que le Garbage Collector puisse libérer la mémoire? C'est bien, mais que faire si les utilisateurs ne sont pas efficaces et ne réduisent pas les branches? Devrais-je faire un module de gestion de la mémoire qui consiste à fermer des branches qui n'ont pas été touchées depuis un moment?

Tout cela semble beaucoup de travail afin de ne pas manquer de mémoire.

Editer: Dois-je publier des données sur l'effondrement d'un noeud? Si oui, quand? L'idée de cache d'objets faibles est bonne, mais devrais-je juste continuer à remplir l'interface utilisateur jusqu'à ce qu'elle bute (ce n'est peut-être pas une mauvaise idée)?

Répondre

1

Si les utilisateurs ne réduisent pas les branches, alors je suppose qu'ils vont faire défiler des nœuds de 750K à 20M, n'est-ce pas? Semble plutôt inefficace pour moi d'un utilisateur POV. Ainsi, le problème pourrait bien être auto-exécutoire.

+0

Point intéressant. D'un autre côté, je pense à des structures non arborescentes qui pourraient fonctionner. Travailler sur PHP récemment dans Eclipse m'a convaincu que la structure de l'arbre elle-même est assez agaçante pour un grand nombre de nœuds. –

+0

D'accord, mais ma question restante est SI je devrais libérer des données sur l'effondrement du nœud. –

1

Dans la plupart des frameworks que j'ai vus, la structure de l'arbre elle-même est assez efficace, mais si vous avez un objet non-trivial à chaque feuille d'arbre, il ajoute rapidement. Le plus simple serait de ne rien stocker sur les feuilles de l'arbre, mais sur la méthode render/draw/update/whatever, choisissez votre objet dans un cache de faible affranchissement. Si ce n'est pas le cas, chargez le serveur. l'astuce consiste à ne garder aucune autre référence à l'objet, seulement la plus faible sur le cache. De cette façon, il sera toujours disponible, mais collecté si nécessaire.

+0

Merci pour cette réponse. C'est un point intéressant. Actuellement, je fais quelque chose comme ça pour les données non-arbre (les données associées aux nœuds). –

Questions connexes