我编写了一些使用XmlDocument
对象加载XML文档的代码,以便计算它的节点。这是方法:
XmlDocument xml = new XmlDocument();
xml.Load(textBox1.Text);
XmlNodeList nodes = xml.SelectNodes("//File");
foreach (XmlNode node in nodes)
{
number_of_childs++;
}
我面临的问题是,在导入大文件时,需要700MB的RAM。如果我然后尝试对文件执行某些操作,或者甚至从中读取以在ListView
中显示其数据,则应用程序需要2GB的RAM。所以,我想知道,有没有一种方法可以关闭XmlDocument
并释放内存,释放RAM。它就像是忘记从内存中删除它的内容。
答案 0 :(得分:15)
没有。 XmlDocument
类没有实现IDisposable
,因此没有办法强制它随意释放它的资源。如果您确实需要立即释放XmlDocument
使用的内存,唯一的方法是执行以下操作:
nodes = null;
xml = null;
GC.Collect();
垃圾收集器在一个单独的线程上工作,因此它可能仍然不会立即发生。要在继续执行代码之前强制同步进行垃圾收集,您还必须调用WaitForPendingFinalizers
,如下所示:
nodes = null;
xml = null;
GC.Collect();
GC.WaitForPendingFinalizers();
XmlDocument
始终将整个文档一次性加载到内存中。如果您只是希望以流形式遍历文档中的节点,则一次只加载一点,这就是XmlReader
类的用途。但是,你失去了很多功能。例如,无法通过XPath选择节点,就像您在示例中所做的那样。使用XmlReader
,您必须编写自己的逻辑来确定文档中的位置以及它是否与您要查找的内容相匹配。
答案 1 :(得分:2)
如果您不需要操作XML,只需使用 XMLReader 读取XML,这是单向且最快的,操作内存较少。
答案 2 :(得分:1)
无需将对象设置为null。 GC应该能够指出文件是否还没有被使用。这将在需要内存时自动发生,但如果要立即清除它,请立即致电GC.Collect()。有关进一步的讨论,请参阅this thread。