C# : the close method of Xml.Load(file)

本文关键字:Load file Xml of the close method | 更新日期: 2023-09-27 18:37:14

我编写了一些代码,使用 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。 就像忘记从内存中删除其内容一样。

C# : the close method of Xml.Load(file)

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

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

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

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

XmlDocument始终一次将整个文档加载到内存中。 如果您只想以流的形式循环访问文档中的节点,一次只加载一位,这就是 XmlReader 类的用途。 但是,这样您将丢失许多功能。 例如,无法像示例中那样通过 XPath 选择节点。 使用 XmlReader ,您必须编写自己的逻辑来确定您在文档中的位置以及它是否与您正在寻找的内容匹配。

无需将对象设置为 null。GC 应该能够指示文档是否不再单独使用。这将在需要内存时自动发生,但如果您想立即清除它,请立即调用 GC。收集()。有关进一步讨论,请参阅此线程。

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