XSLT-преобразование в больших XML-файлах с C # - PullRequest
5 голосов
/ 23 июня 2010

У меня есть очень большие XML-файлы (от 800 МБ до 1,5 ГБ).Мне нужно применить XSLT к этому.Я могу читать это XMLTextReader.Когда я применил XSLT-преобразование, получим SystemOutOfMemory Exception.

Мой код выглядит так:

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 и выполнить преобразование.

Ответы [ 3 ]

5 голосов
/ 23 июня 2010

XSLT использует XPath, и для этого требуется, чтобы весь XML-документ сохранялся в памяти. Таким образом, проблема нехватки памяти по определению .

Существуют простые правила для определения приблизительного объема памяти, и одно из них говорит: 5 * text-size.

Таким образом, для «типичного 1,5 ГБ XML-файла» может быть достаточно 8 ГБ ОЗУ.

Либо разделите документ на более мелкие части, либо дождитесь реализации XSLT 2.1 , которая определяет специальные инструкции потоковой передачи. В то же время можно использовать последнюю (коммерческую) версию Saxon, которая реализует расширения для потоковой передачи, и об успешной обработке документа объемом 64 ГБ сообщается в твиттере.

2 голосов
/ 23 июня 2010

мы сталкиваемся с подобной проблемой.Решение, к которому мы пришли, состояло в том, чтобы не использовать xslt для этого случая, а вместо этого использовать преобразования Linq в Xml при обработке данных.Вы можете использовать ключевое слово c # yield для итерации по потоку xml и таким образом решить проблему с файлом.См. потоковую передачу с linq to xml

. Природа xslt требует загрузки xml в память.что должно произойти, это то, что вам нужно разбить большой файл на более управляемые части.если вы используете технику потоковой передачи xml, вы можете разбить документ на подэлементы, к которым затем можно применить xslt по отдельности.вам, возможно, придется переписать xslt, чтобы учесть это поведение.

Помимо этого, единственный другой вариант - добавить больше оборудования, но это может даже потребовать обновления операционной системы в зависимости от ограничений ОЗУ ...

0 голосов
/ 23 июня 2010

Не знаю, сильно ли это помогает, но вот код, который я использую для преобразования больших файлов:

   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);

Это может занять некоторое время, но, похоже, работа выполнена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...