C# : la méthode close de Xml.Charge(fichier)
J'ai écrit un code qui charge un document XML à l'aide d'un XmlDocument
objet, de telle sorte qu'à compter de nœuds. Voici la méthode:
XmlDocument xml = new XmlDocument();
xml.Load(textBox1.Text);
XmlNodeList nodes = xml.SelectNodes("//File");
foreach (XmlNode node in nodes)
{
number_of_childs++;
}
Le problème que je suis confronté est, lors de l'importation d'un fichier de grande taille, il prend comme 700MO de RAM. Si je puis essayer de faire une opération sur le fichier, ou même de lire afin d'afficher ses données dans un ListView
, l'application prend comme 2 go de RAM. Donc, je me demandais, est-il une méthode qui ferme la XmlDocument
et libère sa mémoire, de libérer de la RAM. C'est comme oublier d'effacer son contenu à partir de la mémoire.
Vous devez vous connecter pour publier un commentaire.
Pas. Le
XmlDocument
classe n'implémente pasIDisposable
, donc il n'y a aucun moyen de le forcer à libérer des ressources à volonté. Si vous avez vraiment besoin immédiatement pour libérer la mémoire utilisée parXmlDocument
, la seule façon de le faire serait de faire ce qui suit:Le garbage collector fonctionne sur un thread séparé, de sorte qu'il peut tout de même pas se faire immédiatement. À force de la collecte des déchets pour produire de façon synchrone, avant de poursuivre l'exécution de votre code, vous devez également appeler
WaitForPendingFinalizers
, en tant que tel:XmlDocument
charge toujours la totalité du document en mémoire à la fois. Si vous voulez simplement parcourir les nœuds dans le document comme un ruisseau, que le chargement un peu à la fois, qu'est ce que leXmlReader
classe. Cependant, vous perdez beaucoup de fonctionnalités de cette façon. Par exemple, il n'y a aucun moyen de sélectionner des nœuds via XPath, comme vous, où en train de faire dans votre exemple. AvecXmlReader
, vous devez écrire votre propre logique pour déterminer où dans le document que vous êtes et si qui correspond à ce que vous recherchez.Si vous n'avez pas à Manipuler le XML, il suffit de lire le XML à l'aide de XMLReader, qui est unidirectionnelle et le plus rapide, avec moins de mémoire intense opération.
Il n'est pas nécessaire de régler votre objet à null. Le GC doit être en mesure d'indiquer si le Document n'est pas utilisé sur son propre. Cela se fera automatiquement que la mémoire est nécessaire, mais si vous voulez l'effacer immédiatement appel GC.Collect(). Voir ce fil pour la poursuite des discussions.
null
dès qu'il n'est plus utilisé, ou quelque chose?GC.Collect
etGC.WaitForPendingFinalizers
qui a montré la différence de comportement entre la Libération et de Débogage. L'exemple d'application a montré que, même si la variable est portée il a obtenu finalisé sans paramètre à null. Je peux vous envoyer l'échantillon si vous êtes intéressé.