8

我编写了一些使用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。如果我然后尝试对文件进行一些操作,或者甚至从中读取以在 a 中显示其数据ListView,则应用程序需要 2GB 的 RAM。所以,我想知道,是否有一种方法可以关闭XmlDocument并释放其内存,释放 RAM。就像它忘记了从内存中删除它的内容一样。

4

3 回答 3

17

不,这个XmlDocument类没有实现IDisposable,所以没有办法强迫它随意释放它的资源。如果您确实需要立即释放 使用的内存XmlDocument,唯一的方法是执行以下操作:

nodes = null;
xml = null;
GC.Collect();

垃圾收集器在单独的线程上工作,因此它可能仍然不会立即发生。要强制垃圾收集同步发生,在继续执行代码之前,您还必须调用WaitForPendingFinalizers,如下所示:

nodes = null;
xml = null;
GC.Collect();
GC.WaitForPendingFinalizers();

XmlDocument总是一次将整个文档加载到内存中。如果您只是想以流的形式遍历文档中的节点,一次只加载一点,这就是XmlReader类的用途。但是,这样会失去很多功能。例如,无法通过 XPath 选择节点,就像您在示例中所做的那样。使用XmlReader,您必须编写自己的逻辑来确定您在文档中的位置以及是否与您要查找的内容相匹配。

于 2012-06-13T13:38:01.437 回答
2

无需将您的对象设置为 null。GC 应该能够指示 Document 是否没有被自己进一步使用。这将在需要内存时自动发生,但如果您想立即清除它,请调用GC.Collect()。请参阅此线程以进行进一步讨论。

于 2012-06-13T13:47:57.747 回答
1

如果您不必操作 XML,只需使用XMLReader读取 XML ,这是单向且最快的,内存密集型操作较少。

于 2012-06-13T13:34:57.980 回答