我写了使用加载XML文档的一些代码XmlDocument
对象,以计算它的节点。 这里是方法:
XmlDocument xml = new XmlDocument();
xml.Load(textBox1.Text);
XmlNodeList nodes = xml.SelectNodes("//File");
foreach (XmlNode node in nodes)
{
number_of_childs++;
}
我现在面临的问题是,导入大量文件时,它需要像RAM 700MB。 如果我再尝试做对文件中的一些操作,甚至可以从中读出的,以显示其数据ListView
,应用程序需要像2GB的RAM。 所以,我想知道,有没有关闭的方法XmlDocument
并释放其内存,释放内存。 它就像它忘记从内存中删除的内容。
号的XmlDocument
类不实现IDisposable
,所以没有办法迫使它随意释放它的资源。 如果你真的需要立即释放被使用的内存XmlDocument
,要做到这一点的唯一方法是做到以下几点:
nodes = null;
xml = null;
GC.Collect();
垃圾收集器工作在一个单独的线程,所以它可能仍然不会立即发生。 要强制垃圾收集同步发生,继续执行你的代码之前,你还必须调用WaitForPendingFinalizers
,因为这样的:
nodes = null;
xml = null;
GC.Collect();
GC.WaitForPendingFinalizers();
XmlDocument
总是加载整个文档到内存中一次。 如果您只是想通过节点的文档作为流中的迭代,每次只装了一下,那是什么样XmlReader
类是。 但是,你失去了很多的功能的方式。 举例来说,有没有办法通过XPath来选择的节点,因为你在哪里在你的例子做。 随着XmlReader
,你必须编写自己的逻辑来确定你在哪里,在文档中,以及是否符合你在找什么。
如果你没有操纵XML,使用的XMLReader只是读取XML,即单向和最快的速度,用更少的内存紧张作业。
有没有必要给你的对象设置为null。 如果文档不使用任何进一步的它自己的GC应该能够指示。 如需要的内存这将自动发生,但如果你想清除它立即调用GC.Collect的() 。 见这个线程作进一步讨论。