Conseils sur les relations avec les grandes chaînes En ce qui concerne l'utilisation de la mémoire

StackOverflow https://stackoverflow.com/questions/2020807

Question

Comment puis-je forcer un psy d'un DataTable et / ou liste afin que je puisse libérer efficacement la mémoire? Je retire actuellement la ligne traitée de la DataSet chaque itération de la boucle, mais je ne sais pas si la mémoire est libérée.

for (int i = m_TotalNumberOfLocalRows - 1; i >= 0; i--)
{
   dr = dt.Rows[i];
   // Do stuff
   dt.Rows.Remove(dr);
}

Si cela ne rétrécit pas l'empreinte du DataTable en mémoire que je peux utiliser une liste. Je suis seulement en utilisant le DataTable comme magasin pour les DataRows, je pourrais utiliser tout ou collection mécanisme de stockage qui serait faible sur la mémoire et être capable de libérer de la mémoire toutes les itérations x.

Merci.



Edit: Après avoir fait quelques profilage de la mémoire après avoir lu Quels sont les bons .NET Profilers? I « ai découvert que le principal consommateur de mémoire sont des chaînes.

Nous faisons beaucoup de sortie de l'utilisateur au cours de ce processus, et la consommation de mémoire du vélo entre environ 170MB-230MB, avec un pic à environ 300MB. J'utilise un StringBuilder avec une taille initiale de 20.971.520 pour maintenir la sortie / journal de ce qui se passe et après un pour cent du nombre total d'enregistrements ont été traités, je suis une propriété mise en texte de contrôle DevExpress MemoEdit au StringBuilder.ToString (). J'ai trouvé que cette méthode est plus rapide que le StringBuilder.ToString annexant () au MemoEdit.Text (évidemment la logique w.r.t. StringBuilder est différent entre annexant et le réglage du MemoEdit.Text)

Je l'ai aussi trouvé qu'au lieu de recréer le StringBuilder (20971520), il est plus facile et plus rapide de la mémoire pour exécuter juste StringBuilder.Remove(0, StringBuilder.Length)

Y a-t-il des conseils que vous pourriez partager pour améliorer les performances lorsque vous travaillez avec de grandes chaînes (le fichier journal qu'il écrit que contient le journal est d'environ 12.2MB pour environ 30 000 dossiers)?

Note: J'ai changé le titre de la question et les balises
. Titre de vieux: Comment puis-je forcer un psy d'un DataTable et / ou une liste de libérer de la mémoire
Tags: Old liste datatable c # .net mémoire

Était-ce utile?

La solution

Essayez de forcer un passage garbage collector:

GC.Collect();

Si vous voulez vous assurer que tous les objets sont finalisés avant l'exécution de votre code continue, appel

GC.WaitForPendingFinalizers();

juste après GC.Collect ()


EDIT: Comme personnes mentionnées dans les commentaires ci-dessous, il est largement considéré comme une mauvaise pratique d'appeler le Garbage Collector directement. Néanmoins, cette sould atteindre l'objectif de libérer la mémoire unnused de vos lignes supprimées.

Autres conseils

Sauf si vous rencontrez un problème avec la mémoire, ne pas essayer gratuitement manuellement en appelant le collecteur des ordures. Le temps d'exécution se chargera pour vous et 99% du temps d'être plus efficace à ce que vous voulez en essayant de deviner le moment optimal est.

Qu'est-ce que vous avez à retenir est que lorsque vous appelez GC.Collect (), il va à l'encontre de tous les niveaux de la collecte des ordures et « range » tous les objets qui doivent doivent être libérés. Vous serez très probablement passer du temps processeur, etc. manipulation quelque chose qui n'a pas besoin d'être fait à ce moment.

Si vous devez absolument la commande est GC.Collect()

http://msdn.microsoft.com/en-us/library /xe0c2357.aspx

http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm

Stick à DataTable et supprimer des lignes inutiles comme dans votre exemple.

En faisant cela, vous ne pouvez pas contrôler l'utilisation de la mémoire: ceci est fait par le Garbage Collector CLR.

Avez-vous un besoin explicite de gérer ce directement? Le garbage collector gère pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top