更有效地使用XMLReader

本文关键字:XMLReader 有效地 | 更新日期: 2023-09-27 18:27:50

我有以下代码:

    for (i = 1; i <= loopsNeeded; i++)
    {
        lblCurrent.Text = string.Format("{0} of {1}", i, loopsNeeded);
        prgWriteProgress.Value = i;
        this.Refresh();
        reader = XmlReader.Create(FilePath);
        outputFile = CreateXmlOutputFileName(xmlFileInfo);
        FileStream stream = new FileStream(outputFile, FileMode.Create);
        xslArg = new XsltArgumentList();
        xslArg.AddParam("Index", "", currentNode);
        xslArg.AddParam("BatchSize", "", batchSize);
        transformation.Transform(reader, xslArg, stream);
        currentNode+=batchSize;
        stream.Flush();
        stream.Close();
    }

这段代码运行在一个XML文件中,每次都会挑选出一批特定的信息,并逐渐在文件中移动。

根据MSDN:

XmlReader只提供对XML数据流的前向只读访问。

这给我带来了一个问题,即需要在每个循环中重新定义XML读取器,以确保它从文件的顶部开始。

测试给出了以下反馈:

125,000 information nodes/125,000 per batch file = 48 mins.  
125,000 information nodes/5000 per batch file = 58 mins.  
125,000 information nodes/500 per batch file = 2 hours 33 mins.

正如您所看到的,由于需要不断地将0.8gig文件重新加载到XMLReader中,因此在运行较小的批处理大小时会产生很大的反响。

有没有一种方法可以避免每次都重新声明XMLReader,从而减少我遇到的开销?

更有效地使用XMLReader

您可以使用XDocument类。它提供了一个更好的Xml文档抽象。

var xDocument = XDocument.Load(filePath);
for (i = 0; i < loopsNeeded; i++)
{
  ...  
  var reader = xDocument.CreateReader();
  ...
}

我可能错了,但在这种情况下,做一些类似(伪代码,对不起)的事情会更好吗

Load the xmlreader
loop through the nodes that you want to match from in the reader
    if node matches criteria
         output node
end loop

意味着您加载阅读器一次,但对于大型文档,保留阅读器的快速、仅向前的特性。