更有效地使用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,从而减少我遇到的开销?
您可以使用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
意味着您加载阅读器一次,但对于大型文档,保留阅读器的快速、仅向前的特性。