Эффективный XSLT-процессор - PullRequest
0 голосов
/ 12 августа 2011

Ранее я использовал бесплатную версию Saxon 8.9 для преобразования XML на основе некоторых XSL.Но проблема с этой версией касалась больших файлов XML размером 260 МБ и выше, Саксон выдал исключения «нехватка памяти».Я получил бесплатную версию Saxon 9.2, но проблема все та же.У машины 2 ГБ оперативной памяти.Кто-нибудь знает лучшую версию Saxon или какой-нибудь другой эффективный конвертер, который мог бы решить проблему (но он должен быть бесплатным)?Если свободное программное обеспечение недоступно, можно также предложить приобретаемый конвертер, но продукт Saxon в приоритете.

Ответы [ 3 ]

1 голос
/ 12 августа 2011

С огромными документами вы обычно хотите избежать загрузки всего документа в память за один раз. К сожалению, XSLT на самом деле не предназначен для этого случая (хотя похоже, что в XSLT 2.1 есть некоторые соображения относительно потоковой передачи, я не уверен, есть ли еще реализации).

Можете ли вы исследовать использование потоковых преобразований для XML ?

1 голос
/ 12 августа 2011

Итак, я попытался с xml-файлом размером более 300 МБ

.
 -rw-r--r--    1 nicolasm Administ 311056011 Aug 12 15:27 test1.xml

А в командной строке немного увеличил настройки памяти '

 java -Xmx1400m -jar saxon9-9.1.0.8.jar test1.xml test.xsl > out.xml

И трансформация прошла хорошо.

Обратите внимание, что

  • Я тестировал на Windows 32bit, поэтому не могу использовать больше 1,5 г памяти для создания виртуальной машины Java.
  • XSL был довольно прост.

Итак, два вопроса:

  • насколько сложен ваш XSL. Использование памяти для XSLT во многом зависит от того, какие инструкции используются
  • сколько памяти вы дали JVM?
0 голосов
/ 30 августа 2011

Традиционно XSLT разрабатывался так, что для его загрузки в память требуется весь XML-документ. Таким образом, в среднем объем памяти, необходимый для применения XSL, обычно в два или три раза превышает размер входного XML, или в худшем случае может потребоваться объем памяти, в 10 раз превышающий размер входного XML. Saxon 9.3 обеспечивает функциональность потокового преобразования XML. Таким образом, в этом случае используемая память является последовательной. Но это требует изменений в XSL, и узлы, обрабатывающие один за другим, должны быть независимы друг от друга. Потоковое преобразование XML не загружает весь документ в память, поэтому требует меньше памяти и в идеале может обрабатывать документы XML любого размера.

...