XSLT 3.0 связал пакетную потоковую передачу с Saxon – соображения по потреблению памятиJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 XSLT 3.0 связал пакетную потоковую передачу с Saxon – соображения по потреблению памяти

Сообщение Anonymous »

Я занимаюсь оптимизацией существующего процесса преобразования XML в XML с точки зрения потребления памяти. Мы преобразуем большие XML-файлы размером несколько ГБ в гораздо меньшую внутреннюю XML-структуру — размер результата составляет менее 10 %. Преобразование реализуется в 4 разных XSLT-этапах — в основном это делаем мы:

Код: Выделить всё

sourcefile.xml -> xslt1 -> xslt2 -> xslt3 -> xslt4 -> targetfile.xml
Это было реализовано как непотоковое цепное преобразование с использованием SAX-api с saxon. К настоящему времени все 4 преобразования были настроены для пакетной потоковой передачи. В рамках этого мы также изменили реализацию вызова Java, чтобы использовать Saxon s9api с Xslt30Transformer (тестирование проводилось с использованием Saxon 10.6).
Мы видим следующий шаблон с тестовым исходным файлом 500 МБ.
  • Необходимая память для процесса SAX с непотоковой передачей: -Xmx 2 ГБ
  • Потребность в памяти для одной фазы потокового трафика: менее 200 МБ, прекрасно работает с -Xmx200M — это было бы идеально.
  • если мы объединим потоковые потоки трафика, используя множественный трафик .asDocumentDestination(nextTrafo) нам нужно 4 ГБ памяти для его запуска, иначе он остановится с сообщением «Превышен лимит GC Overhead».
Мы можем воспроизвести это, объединив только 2 из 4 трафиков:
  • отдельное выполнение с Xmx200M выполняется для и то, и другое.
  • для запуска цепного выполнения требуется -Xmx4G.
Мы спрашиваем себя, следует ли этого ожидать и это нормально, поскольку в случае цепной потоковой передачи может возникнуть необходимость буферизовать данные между трафиками? или есть проблема в нашей реализации...
Таким образом, мы могли бы, очевидно, сохранять на диск между трафосами и иметь 4 отдельных шага, каждый из которых потребляет 200 МБ - но действительно ли это оптимально при потоковой передаче на диск? между трафиком?
Можно ли ожидать такого поведения или что-то не так в нашей реализации?
--- отредактировано, добавлено больше информации, которая кажется, указывает на то, что потоковая передача работает также в случай с цепочкой:
  • Я вижу частично записанный файл result.xml даже в случае с цепочкой, когда я устанавливаю -Xmx500M и получаю OOM: около 10% ожидаемый результат.xml находится в файловой системе.
  • Я также вижу в журналах, что оба связанных трафика запускаются почти одновременно - сразу после компиляции, и я вижу работающий журнал второй трафо (строка для каждого обработанного документа).
  • работающий журнал начинается быстро, затем примерно через 15 секунд замедляется (когда GC начинает срабатывать), а затем, наконец, останавливается незадолго до OOM-Exception.< /li>
    Я вижу только 3 небольших дерева (2x 500 узлов, 1x 30 000 узлов), которые строятся для загрузки статических таблиц сопоставления. Те же деревья строятся, когда я успешно запускаю одну потоковую передачу. trafo с исходным файлом размером 500 МБ и Xmx200M — в журналах других деревьев не видно.
Теперь я попробую с новейшей версией Saxon 12.x (использовал 10.6 для тестов, так как клиент в настоящее время все еще использует это в проде)
Если это ничего не изменит, то сократим/изолируем случай и запустим заявку в службу поддержки, как предложил Майкл ниже.

наш (упрощенный) код выглядит так:

Код: Выделить всё

// trafo1234 are Xslt30Transformer we got using xsltCompiler.compile().load30()

Serializer finalDest = trafo4.newSerializer(Files.newOutputStream(outFile));
StreamSource input = Files.newInputStream(inFile);
trafo1.applyTemplates(input,
trafo2.asDocumentDestination(
trafo3.asDocumentDestination(
trafo4.asDocumentDestination(finalDest))));

PS: есть ли простой способ увидеть/измерить потребности в памяти для преобразования? Пока что единственный способ, который я нашел, - это играть с -Xmx, пока не получу OOM-Exception

Подробнее здесь: https://stackoverflow.com/questions/793 ... iderations
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»