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