我有以下代码:
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,从而减少了我遇到的开销?
答案 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
意味着您只需加载阅读器一次,但只保留阅读器对于大型文档的快速,仅向前性质。