更有效地使用XMLReader

时间:2012-03-15 14:58:51

标签: c# xml performance xmlreader

我有以下代码:

    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,从而减少了我遇到的开销?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

Load the xmlreader

loop through the nodes that you want to match from in the reader

    if node matches criteria
         output node

end loop

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