2009-06-10 8 views
3

Je suis actuellement en train de concevoir un site web en C#, qui utilise un code très complexe pour générer une liste de recherche, que je suis en train de concevoir comme une structure arborescente. La principale raison pour laquelle j'utilise un arbre est le fait que ce site web est très fréquenté et possède un filtre de recherche très complexe, ce qui signifie que l'évolutivité est très importante, mais je crains que les exigences de mémoire de l'arbre ne l'emportent les exigences de traitement efficaces de simplement recalculer les valeurs à chaque fois.Taille d'un dictionnaire

Est-ce que quelqu'un connaît un moyen fiable de mesurer la taille d'un dictionnaire en C#? La méthode Marshal.SizeOf() ne le permet pas car le code n'est pas non géré.

Cheers, Ed

+0

+1 J'ai eu le même problème: http: // stackoverflow.com/questions/751710/how-to-find-out-size-of-asp-net-session-when-there-are-non-serializable-objects –

+1

Pensez à utiliser le profileur de mémoire; Son but est de vous aider à analyser votre utilisation de la mémoire. http://msdn.microsoft.com/en-us/library/ms979205.aspx –

Répondre

3

Le meilleur pari est d'exécuter la charge sur le site sous différents modèles et vérifier the relevant performance counters. Pour simplifier, vous pouvez simplement extraire le code qui crée et stocke les structures de données, et l'intégrer dans une application de console. Exécutez une charge simulée et vérifiez les compteurs de perf. Vous pouvez faire varier les choses et mesurer l'impact sur la consommation de mémoire et la récupération de place. Faire cela isolerait les effets que vous voulez mesurer.

Si vous pensez que «ça a l'air de beaucoup de travail», alors il vaut mieux acheter plus de mémoire.

+1

Cela ressemble beaucoup à beaucoup de travail, mais je suis pas sûr que l'achat de plus de mémoire va fonctionner, étant donné qu'il peut facilement y avoir quelques centaines de milliers d'objets dans le dictionnaire! –

+0

Pas vraiment trop de travail. Écrivez le code qui simule différents scénarios et stratégies. Exécutez chaque stratégie à travers plusieurs sessions, chaque session pendant 5-10 minutes ou plus, et interrogez les compteurs de perf importants toutes les 15 ou 20 secondes. À la fin de la course, produire automatiquement des feuilles et des graphiques Excel avec la sortie pour chaque cycle. Lorsque vous avez tout cela configuré, appuyez sur le bouton de démarrage. Aller déjeuner ... Revenez 3 heures plus tard. – Cheeso

+0

Cela ressemble à un bon plan, je vais me donner un jour pour le faire plus tard dans la construction! –

0

Une façon de le faire ... initialiser votre arbre avec un nombre arbitraire d'éléments, mesurer la taille de la mémoire consommée par le processus, ajouter 1000 nouveaux éléments, mesurer la taille de la mémoire à nouveau, soustrayez et diviser.

+0

Je pense que c'est un peu trop imprécis pour mon patron, bien que ce soit une option faisable –

0

Vous pourriez créer une petite application avec un seul dictionnaire, puis l'analyser dans plusieurs scénarios en utilisant WinDbg ou ClrProfiler. (? En dehors de raversing champs internes en utilisant la réflexion)

Je ne pense pas qu'il y ait un moyen d'obtenir la taille totale de l'objet dans l'exécution