Более эффективное использование XMLReader - PullRequest
2 голосов
/ 15 марта 2012

У меня есть следующий код:

    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,8 гигабайта в XMLReader.

Есть ли способ избежать необходимости заново объявлять XMLReader каждый раз, тем самым уменьшая накладные расходы, с которыми я сталкиваюсь?

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

Вы можете использовать класс XDocument .Он обеспечивает гораздо более приятную абстракцию Xml-документа.

var xDocument = XDocument.Load(filePath);
for (i = 0; i < loopsNeeded; i++)
{
  ...  
  var reader = xDocument.CreateReader();
  ...
}
0 голосов
/ 15 марта 2012

Я могу ошибаться, но было бы лучше в этом случае вместо этого сделать что-то вроде (псевдокод, извините):

Load the xmlreader

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

    if node matches criteria
         output node

end loop

Означает, что вы загружаете считыватель один раз, но сохраняете быструю, прямую природу считывателя для большого документа.

...