Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更有效地使用XMLReader_C#_Xml_Performance_Xmlreader - Fatal编程技术网

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给出了答案,并将从中了解我是否会研究其中一个。