У меня есть некоторые очень большие XML-файлы (800 МБ к 1,5 ГБ). Я должен применить XSLT на это. Я могу считать его XMLTextReader. Когда я применил преобразование XSLT, получите Исключение SystemOutOfMemory.
Мой код похож;
static void Main(string[] args)
{
XDocument newTree = new XDocument();
XmlTextReader oReader = new XmlTextReader(@"C:\Projects\myxml.xml");
using (XmlWriter writer = newTree.CreateWriter())
{
XslCompiledTransform oTransform = new XslCompiledTransform();
oTransform.Load(@"C:\Projects\myXSLT.xsl");
oTransform.Transform(oReader, writer);
}
Console.WriteLine(newTree);
}
Заранее спасибо. Это очень срочно. Если я не получаю решения, я должен разделить XML на меньший XML и сделать преобразование.
XSLT использует XPath, а это требует, чтобы весь XML документ хранился в памяти. Таким образом, проблема нехватки памяти существует по определению.
Существуют простые правила, позволяющие приблизительно определить, сколько памяти необходимо, и одно из них гласит 5 * text-size
.
Таким образом, для "типичного XML-файла размером 1,5 ГБ" может быть достаточно 8 ГБ оперативной памяти.
Либо разбейте документ на более мелкие части, либо дождитесь реализации XSLT 2.1, которая определяет специальные потоковые инструкции. Тем временем можно использовать последнюю (коммерческую) версию Saxon, в которой реализованы расширения для потоковой передачи данных и об успешной обработке 64 ГБ документа сообщалось в twitter.
, мы сталкиваемся с аналогичной проблемой. Решение, с которым мы пришли, заключалось в том, чтобы не использовать xslt для этого случая, а вместо этого использовать преобразования Linq в Xml при передаче данных. Вы можете использовать ключевое слово c # yield для перебора XML-потока и обработки файла по частям. См. потоковая передача с linq в xml
природа xslt требует, чтобы xml был загружен в память.что должно произойти, так это разбить большой файл на более управляемые части. если вы используете технику потоковой передачи xml, вы можете разбить документ на подэлементы, к которым затем можно индивидуально применить xslt. вам, возможно, придется переписать xslt, чтобы учесть такое поведение.
Помимо этого, единственный другой вариант - добавить к нему больше оборудования, но это может даже потребовать обновления операционной системы в зависимости от ограничений ОЗУ ...
Не знаю, сильно ли это поможет, но вот код, который я использую для преобразования больших файлов:
XPathDocument myXPathDoc = new XPathDocument("xmfile.xml");
XslCompiledTransform myXslTrans = new XslCompiledTransform() ;
XsltSettings st = new XsltSettings(true, true);
myXslTrans.Load("StyleSheet.xslt", st, null);
StreamWriter s =new StreamWriter("output-fie.xslt");
XsltArgumentList ln = new XsltArgumentList();
// some xslt argument processing stuff
myXslTrans.Transform(myXPathDoc, ln, s);
Это может занять некоторое время, но, похоже, это помогает.