2012-03-15 5 views
2

У меня есть следующий код:Более эффективное использование 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); 
     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, тем самым уменьшая накладные расходы, с которыми я сталкиваюсь?

ответ

4

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

var xDocument = XDocument.Load(filePath); 
for (i = 0; i < loopsNeeded; i++) 
{ 
    ... 
    var reader = xDocument.CreateReader(); 
    ... 
} 
+1

И затем вы можете создать читатель из документа, чтобы сделать преобразование. –

+0

Посмотрите на это сейчас и вернитесь к вам. – Mike

+0

+1: удалил мой дубликат ответа. – IAbstract

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 

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

+0

Поскольку я согласен с разными критериями в каждом цикле цикла, я должен вернуть читатель XML в исходное положение, повторно назначив его. Вот где я теряю производительность. - Если я не пойму тебя неправильно? – Mike

+0

Для этого вам нужно будет сделать «набор» критериев, которые вы хотите сопоставить, и сопоставить узел, чтобы узнать, существует ли он в вашем наборе критериев - вы не выполняете критерии. – Paddy

+0

Это зависит от ваших требований - если вы только соответствуете нескольким узлам, то ваш первый способ может быть лучше - если вы согласны с высоким процентом узлов, тогда этот способ может быть лучше. – Paddy

Смежные вопросы