C# 更有效地使用XMLReader
我有以下代码:C# 更有效地使用XMLReader,c#,xml,performance,xmlreader,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); outputFil
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();
}
正如您所看到的,由于需要不断地将0.8gig文件重新加载到XMLReader中,所以在运行较小的批处理时会产生严重的影响
有没有一种方法可以避免每次重新声明XMLReader,从而减少我遇到的开销?您可以使用。它为Xml文档提供了更好的抽象
var xDocument = XDocument.Load(filePath);
for (i = 0; i < loopsNeeded; i++)
{
...
var reader = xDocument.CreateReader();
...
}
您可以使用。它为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
意味着您只需加载一次阅读器,但仍保留了大型文档阅读器的快速、仅向前的特性。我在这里可能错了,但在这种情况下,是否最好改为执行伪代码之类的操作,对不起:
Load the xmlreader
loop through the nodes that you want to match from in the reader
if node matches criteria
output node
end loop
这意味着您只需加载一次读卡器,但保留了大文档的读卡器的快速、仅向前的特性。然后您就可以从文档中创建一个读卡器,以便进行转换。我们现在将对此进行研究,然后再与您联系。但800MB的读卡器并不简单。更好地运行64位这花了5000批测试40秒,明天将运行500批测试,因为这是最值得注意的地方,在我今晚回家之前没有时间运行它:在更长的过程中花了4分钟,不是太多,但总比没有好!然后你可以从文档中创建一个读卡器来进行转换。我们现在将对此进行研究并返回给你。但在800MB的情况下,这并不是一件小事。更好地运行64位这花了5000批测试40秒,明天将运行500批测试,因为这是最值得注意的地方,在我今晚回家之前没有时间运行它:在更长的过程中花了4分钟,不是太多,但总比没有好!当我在循环的每个循环中匹配不同的标准时,我必须通过重新分配XML读取器将其放回起始位置。那就是我失去表演的地方除非我误解了你的意思?要想让它起作用,你需要设置一组你想要匹配的标准,并匹配一个节点,以查看它是否存在于你的标准集中-你不会循环使用这些标准。这取决于你的要求-如果你只匹配两个节点,那么您的第一种方法可能会更好-如果您匹配的节点比例较高,那么这种方法可能会更好。我可以在一个循环中匹配任意数量的节点,可以是整个文件,也可以是每个文件一个节点,这是最终用户可以控制的变量。目前,性能测试@rich.okelly给出了答案,并将从中了解我是否会研究其中的一个。由于我在循环的每个循环中匹配不同的标准,我必须通过重新分配XML读取器来将其放回起始位置。那就是我失去表演的地方除非我误解了你的意思?要想让它起作用,你需要设置一组你想要匹配的标准,并匹配一个节点,以查看它是否存在于你的标准集中-你不会循环使用这些标准。这取决于你的要求-如果你只匹配两个节点,那么您的第一种方法可能会更好-如果您匹配的节点比例较高,那么这种方法可能会更好。我可以在一个循环中匹配任意数量的节点,可以是整个文件,也可以是每个文件一个节点,这是最终用户可以控制的变量。目前性能测试@rich.okelly给出了答案,并将从中了解我是否会研究其中一个。