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 МБ - но действительно ли это оптимально при потоковой передаче на диск? между трафиком?
Ожидается ли такое поведение или что-то не так в нашей реализации?
наш (упрощенный) код выглядит так:

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

// 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»