Xalan XSLT - Недостаточно места в памяти - PullRequest
4 голосов
/ 31 января 2012

В моем проекте есть модуль отчетности, который собирает данные из базы данных в форме XML и запускает на нем XSLT для генерации желаемого пользователем формата отчета. Варианты на данный момент: HTML и CSV.

Мы используем Java и Xalan для всех взаимодействий с данными.

Плохая часть заключается в том, что один из этих отчетов, который пользователь может запросить, занимает 143 МБ (около 430 000 записей) только для части XML. Когда это преобразуется в HTML, у меня заканчивается пространство кучи с максимумом 4096G, зарезервированным для кучи. Это недопустимо.

Кажется, что проблема заключается просто в слишком большом количестве данных, но я не могу помочь, но думаю, что есть лучший способ справиться с этим, чем ограничение клиента и неспособность удовлетворить функциональные требования.

Я рад предоставить больше информации по мере необходимости, но я не могу раскрывать слишком много информации о проекте, поскольку я уверен, что большинство из вас понимают. Кроме того, ответ - да; Мне нужны все данные одновременно: я не могу разбить их на страницы.

Спасибо

EDIT

Все используемые мной классы преобразования находятся в пакете javax.xml.transform. Реализация выглядит так:

final Transformer transformer = 
  TransformerFactory.newInstance().newTransformer(
    new StreamSource(new StringReader(xsl)));
final StringWriter outWriter = new StringWriter();
transformer.transform(
  new StreamSource(new StringReader(xml)), new StreamResult(outWriter));
return outWriter.toString();

Если возможно, я бы хотел оставить XSLT таким, какой он есть. Метод StreamSource должен позволять мне собирать некоторые данные по мере их обработки, но я не уверен, какие ограничения на XSLT (функции и т. Д.) Могут потребоваться для правильной очистки. Если бы кто-то мог указать мне на ресурс с подробным описанием этих ограничений, это было бы очень полезно.

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Проблема с XSLT заключается в том, что вам нужно иметь представление DOM всего исходного документа (а также документа результата) в памяти при выполнении преобразования. Для больших файлов XML это серьезная проблема.

Вас интересует система, которая позволяет осуществлять потоковое преобразование, при котором полные документы не должны повторяться в памяти. Может быть, STX вариант: http://www.xml.com/pub/a/2003/02/26/stx.html http://stx.sourceforge.net/. Он очень похож на XSLT, поэтому, если ваша таблица стилей XSLT применяется к XML простым способом, переписать ее в STX может быть довольно просто.

1 голос
/ 02 февраля 2012

Мы можем улучшить это, выполнив две вещи.

  1. Мы берем исходный и целевой формат XML и делаем их файлы в формате temp.Это сохраняет первоначальное создание и хранение вне ОЗУ, поскольку данные поступают из базы данных и записываются обратно в БД.Все, что нужно, - это обращаться с данными.

  2. Используйте трансформатор Saxonica .Это допускает несколько вещей, включая преобразования в стиле SAX и использование XSLT 2.0, чего нет у синтаксического анализатора Xalan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...