EXSLT: больше нет идентификаторов DTM - PullRequest
4 голосов
/ 15 февраля 2011

Я искал ответ на эту проблему весь день.Я создаю таблицу стилей для XML-документа среднего размера (~ 1,5 МБ, ~ 1000 элементов), что доставляет мне много хлопот.Речь идет о создании графика времени-события для различных перерабатывающих предприятий.XML генерируется через SAP MII QueryTempalte и находится в формате / Rowsets / Rowset / Row.Все эти данные обрабатываются и хранятся в локальном наборе узлов в формате / Оборудование / Оборудование / Событие.Этот набор узлов затем обрабатывается в HTML, а затем отображается в браузере.Теперь у меня начинаются проблемы.Я могу легко получить данные за последние 5 дней, что приводит к ~ 900 строкам данных из MII и обрабатывается в моем формате узла, в результате чего получается чуть менее 900 строк.Но после того, как я нажму 1017 строк, извлеченных из MII, таблица стилей будет отображаться только на полпути, а затем остановится и возникнет исключение «Нет доступных идентификаторов DTM».Теперь сервер MII работает только с JDK 1.5.x, и я прочитал, что это может быть проблемой - единственное, я ничего не могу с этим поделать.Итак, теперь я спрашиваю здесь: есть ли способ оптимизировать мой код?Я приложил несколько ссылок для моего XSL и образца XML.

XSL: http://pastie.org/1566517 Samlpe XML: http://pastie.org/1566522

Теперь образец XML может не дать никакого результата "забавные »визуальные результаты, и не сможет повторить ошибку.Но если бы кто-нибудь мог заметить предварительную оптимизацию, я хотел бы знать :) Я думал, что было бы неплохо заменить / переместить вычисления для startOffset, endOffset и т. Д., Но я не могу понять, как.

Надеюсь, кто-нибудь может мне помочь!:)

Ответы [ 2 ]

5 голосов
/ 22 декабря 2016

A Followup

Мы также столкнулись с этой проблемой в другом приложении, причина ошибки та же. Как упоминалось выше, фундаментальная проблема заключается в ограничении xalan , проекта Apache для обработки xslt документов. Ограничение, хотя и срабатывает редко, является результатом исчерпания максимального количества 65535 (16-битных) идентификаторов DTM. В вышеупомянутом приложении этого, по-видимому, избегают, используя функцию эффективности распределения ресурсов в SAP, но это будет неприменимо к другим приложениям, таким как используемое нами.

Изменение Ксалана

Таким образом, ограничение идентификатора DTM в 65K существовало некоторое время (около 2003 г.), было исправлено, а затем потеряло исправление в ветви 2.7 . Текущая, последняя версия 2.7.2 имеет эту проблему. На самом базовом уровне идентификатор документа представляет собой 32-разрядное целое число. Исправление - это изменение исходного кода, которое увеличивает количество бит, выделенных для DTM. Более подробное обсуждение можно посмотреть здесь . Рекомендуется изменить число битов узла на 12, увеличив, таким образом, значение DTM до 20, увеличив общее значение DTM до 1048576. Шаги:

  • скачать xalan source
  • распакуйте и измените src / org / apache / xml / dtm / DTMManager.java, изменив строку, которая устанавливает IDENT_DTM_NODE_BITS.
  • сборка ксалана. Вам, вероятно, понадобится установить ant и соответственно установить classpath . Новый jar будет расположен в каталоге сборки.
  • заменить предыдущий xalan jar на только что построенный.
2 голосов
/ 20 апреля 2012

Знайте, что этот вопрос старый, но просто задайте тот же вопрос сам, поскольку для тех, кто также находит эту проблему, похоже, что есть SAP-нота с подробным описанием патча JVM, который может решить эту проблему:

Примечание # 1604623

https://websmp130.sap -ag.de / сок (bD1lbiZjPTAwMQ ==) / Ьс / БСП / шп / sapnotes / index2.htm? NUMm = 1604623

Одно из исправлений в примечании:

Улучшено потребление ресурсов для преобразования XSLT. Мы исправили утечка ресурсов при обработке XSLT, что приведет к ошибке «DTMException: больше нет идентификаторов DTM» для сложных XSL, использующих (рекурсивные) шаблоны. Причина проблемы в том, что промежуточные результаты этапа обработки сохраняются в DTM, а количество DTM ограничено 65536.

С этим изменением появляется новое системное свойство "Com.sap.jvm.xsltc.enableResourceOptimization". Если это свойство при значении true компилятор XSLT выдаст промежуточные результаты и поэтому потребуется меньше ресурсов. Обработка сложных XSL должна быть возможным Обратите внимание, что это системное свойство не установлено по умолчанию.

...