EXSLT: больше нет доступных идентификаторов DTM

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

XSL: http://pastie.org/1566517 Пример XML: http://pastie.org/1566522

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

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


person Thor Jacobsen    schedule 15.02.2011    source источник
comment
xml.apache.org/xalan-j/faq.html#faq- N10340 говорит, что проблема возникает только с очень старой версией Xalan. Даже если вы не можете изменить версию JDK, вы можете использовать актуальную версию Xalan от Apache вместо встроенной версии JDK. Существуют и другие XSLT-процессоры, реализованные в Java и используемые с ними, такие как Saxon, так что вы можете попробовать их на своих образцах данных и таблицах стилей и проверить, работают ли они лучше.   -  person Martin Honnen    schedule 15.02.2011
comment
Проблема в том, что невозможно выяснить, какая версия Xalan работает, и использую ли я ее вообще. Когда я пытаюсь добавить пространство имен xalan в свой xsl, процессор не отображает его. Кроме того, JDK — это SAPsk, а это значит, что у меня нет возможности установить новые вещи или каким-либо образом изменить его :(   -  person Thor Jacobsen    schedule 16.02.2011
comment
Я много раз сталкивался с этой ошибкой из-за того, что JDK 1.4 использовал эту очень старую версию Xalan, поэтому вам действительно следует попытаться выяснить, какую версию вы используете. Я не помню, чтобы найти обходной путь для ошибки ... Что вы имеете в виду под процессором, который не будет отображать его?   -  person Damien    schedule 16.02.2011
comment
Под этим я подразумеваю, что если я попытаюсь обработать слишком большие объемы данных, XSL просто остановится на полпути к рендерингу HTML. Он просто выводит '‹div style=----' как последнюю часть html. Я знаю, что он работает под управлением JDK 1.5.0.53 с Xalan 2.7.1, так что это становится все более и более запутанным. Ранее я пытался запустить Oxygen (отладчик xsl) через JDK, предоставленный SAP, но он отказался. Так что очевидно, что SAP запуталась в JDK, что еще больше усложнило отладку :(   -  person Thor Jacobsen    schedule 16.02.2011
comment
Привет, Тор, ты решил эту проблему?   -  person WDrgn    schedule 13.03.2017
comment
Привет, не помню, извини :)   -  person Thor Jacobsen    schedule 14.03.2017


Ответы (2)


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

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

https://websmp130.sap-ag.de/sap(bD1lbiZjPTAwMQ==)/bc/bsp/spn/sapnotes/index2.htm?numm=1604623

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

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

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

person ChrisM    schedule 20.04.2012
comment
Как я могу установить для com.sap.jvm.xsltc.enableResourceOptimization значение true, если у меня нет этого ‹SAP_install_dir›/‹system_name›/‹instance_name›/j2ee/configtool ??? Спасибо! - person WDrgn; 13.03.2017

Продолжение

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

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

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

  • скачать исходный код xalan
  • распакуйте и измените src/org/apache/xml/dtm/DTMManager.java, изменив строку, которая устанавливает IDENT_DTM_NODE_BITS.
  • построить ксалан. Вам, вероятно, потребуется установить ant и правильно установить путь к классам. Новый jar будет расположен в каталоге сборки.
  • замените предыдущий xalan jar только что построенным.
person waTeim    schedule 21.12.2016
comment
У меня также есть эта ошибка. Больше нет доступных идентификаторов DTM. Я взял исходники, изменил IDENT_DTM_NODE_BITS на 20, перегенерировал xalan.jar, но все та же ошибка. Можете ли вы прислать мне xalan.jar, который работает для вас с этой ошибкой? БЛАГОДАРНОСТЬ! - person WDrgn; 10.03.2017
comment
У меня есть вопрос относительно подробного обсуждения по ссылке, автор говорит: «Я не могу представить, чтобы в моем приложении требовалось более 2 ^ 12 (4096) идентификаторов документов ...», каков на самом деле этот предел идентификаторов документов? Это для JVM? Означает ли это, что Xalan может работать в сумме на макс. 4096 документов одновременно? Представьте себе веб-приложение, которое использует Xalan, в каждом HTTP-запросе будет использоваться Xalan, так что это будет означать ограничение в 4096 параллельных HTTP-запросов одновременно, верно? - person basZero; 22.01.2019