Код: Выделить всё
sourcefile.xml -> xslt1 -> xslt2 -> xslt3 -> xslt4 -> targetfile.xml
Мы видим следующий шаблон с тестовым исходным файлом 500 МБ.
- Необходимая память для процесса SAX с непотоковой передачей: -Xmx 2 ГБ
- Потребность в памяти для одной фазы потокового трафика: менее 200 МБ, прекрасно работает с -Xmx200M — это было бы идеально.
- если мы объединим потоковые потоки трафика, используя множественный трафик .asDocumentDestination(nextTrafo) нам нужно 4 ГБ памяти для его запуска, иначе он остановится с сообщением «Превышен лимит GC Overhead».
- отдельное выполнение с 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))));
Подробнее здесь: https://stackoverflow.com/questions/793 ... iderations