4 votes

Comment résoudre la fragmentation de stringBuilder ?

J'obtiens une belle exception SystemOutOfMemory dans mes StringBuilders. Ce n'est pas dû à un manque de mémoire vive, je pense donc qu'il s'agit d'une fragmentation de la mémoire.

J'ai ~200 objets StringBuiler. Tous ces objets sont réutilisés régulièrement (avec strBldr.clear()). Cela semble provoquer une fragmentation importante de la mémoire de mon système. Comment puis-je résoudre ce problème ?

Merci :)

EDIT :

Voici quelques données :

Taille maximale enregistrée de l'entrée& stringBuilder : 4 146 698.

Nombre moyen de stringBuilders réinitialisés par seconde : >120 (éventuellement >>120)

Longueur de l'entrée à la première erreur : 16 972 (chaîne de caractères)

StringBuilder longueur @ première erreur : 16

Nombre de fois où un nouveau stringBuilder a été créé à la première erreur : ~32500

Utilisation totale de la RAM à la première erreur 637 448K

4voto

Guffa Points 308133

Vous ne devez pas réutiliser un StringBuilder comme ça, il suffit d'en créer un nouveau si nécessaire.

Lorsque vous appelez Clear sur un StringBuilder il ne libérera pas toute la mémoire qu'il a utilisée, il remettra seulement la taille utilisée à zéro. Il aura toujours le même grand tampon, et l'utilisation répétée de la commande StringBuilder signifie seulement que la mémoire tampon sera aussi grande que nécessaire, et ne diminuera jamais.

De même, le maintien de la StringBuilder La réutilisation des objets signifie qu'ils survivent aux collectes de déchets et passent à la prochaine génération de tas. Ceux-ci sont collectés moins fréquemment, ils sont donc plus susceptibles d'être sensibles à la fragmentation de la mémoire.

4voto

Henk Holterman Points 153608

Je suis d'accord, il est fort probable que vous ne manquiez pas de mémoire mais que vous soyez confronté à une fragmentation.

Vous devez vous familiariser avec la fragmentation et le "Large Object heap" (LOH).

Vous ne donnez aucun détail, je ne peux donc que donner des conseils très généraux :

  • essayez d'estimer la taille de vos chaînes et utilisez le paramètre Capacity pour un nouveau SB
  • rond arriba (vraiment) ces tailles en multiples d'un certain nombre. Cela favorise la réutilisation.
  • N'utilisez Clear() que lorsque vous vous attendez à ce que le nouveau contenu ait presque la même taille que l'ancien, c'est la croissance qui vous tue.

Modifier

Taille maximale enregistrée de l'entrée& stringBuilder : 4 146 698.

  • Assurez-vous qu'il n'y a pas d'intermédiaires nécessaires avec une taille supérieure, puis
  • Créer tous les StringBuilders comme sb1 = new StringBuilder(4200000);
  • Ne pas essayer de les réutiliser (trop / pas du tout)
  • Ne les gardez pas trop longtemps

0voto

Cort3z Points 1657

Ce que j'ai fini par faire, c'est migrer vers x64 . Cela a résolu mes problèmes.

Il est possible que j'aie effectivement attribué tout l'espace mémoire de x86, même si je ne l'ai pas utilisé en totalité. La migration vers x64 résoudrait certainement ce problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X