Проблемы производительности Oracle с большими пакетами операций XSL - PullRequest
1 голос
/ 29 апреля 2010

У меня есть система, которая выполняет много XSL-преобразований для объектов XMLType. Проблема заключается в том, что система постепенно замедляется со временем и иногда падает, когда ей не хватает памяти. Похоже, что замедление (и, возможно, сбой памяти) происходит вокруг вызова функции dbms_xslprocessor.processXSL, который постепенно занимает все больше и больше времени.

Код выглядит так:

v_doc dbms_xmldom.DOMDocument;
v_transformer dbms_xmldom.DOMDocument;
v_XSLprocessor dbms_xslprocessor.Processor;
v_stylesheet dbms_xslprocessor.Stylesheet;
v_clob clob;
...
transformer := PKG_STUFF.getXSL();
v_transformer := dbms_xmldom.newDOMDocument(transformer);
v_XSLprocessor := Dbms_Xslprocessor.newProcessor;
v_stylesheet := dbms_xslprocessor.newStylesheet(v_transformer, '');
...
for source_data in (select id in source_tbl) loop
begin
    v_doc := PKG_CONVERT.convert(in_id => source_data.id);
    --start time of operation
    v_begin_op_time := dbms_utility.get_time;
    --reset the CLOB                    
    v_clob := ' ';
    --Apply XSL Transform
    dbms_xslprocessor.processXSL(p => v_XSLprocessor, ss => v_stylesheet, xmldoc => v_Doc, cl => v_clob);
    v_doc := dbms_xmldom.newDOMDocument(XMLType(v_clob));
    --end time
    v_end_op_time := dbms_utility.get_time; 
    --calculate duration
    v_time_taken  :=  (((v_end_op_time - v_begin_op_time)));
    --log the duration
    PKG_LOG.log_message('Time taken to transform XML: '||v_time_taken);
    ...
    ...
    DBMS_XMLDOM.freeDocument(v_Doc);
    DBMS_LOB.freetemporary(lob_loc => v_clob);
end loop;

Время, затрачиваемое на преобразование XML, медленно сокращается (я полагаю, это также может быть вызов dbms_xmldom.newDOMDocument, но я подумал, что это довольно просто). Понятия не имею почему ....: (

(Oracle 10g)

UPDATE:

Дальнейшее тестирование, просто закомментировав вызов processXSL, кажется, значительно ускоряет процесс. Все еще жду большего теста набора данных, чтобы подтвердить это, но кажется, что processXSL - это то, что действительно затягивает. У кого-нибудь еще были проблемы с этим раньше?

Сейчас мы не трансформируем многие XML-документы, только несколько тысяч. XSL не совсем прост, но я только создаю один Processor, один Transformer и один Stylesheet, а затем снова и снова использую их ...

ОБНОВЛЕНИЕ 2:

Даже без преобразований использование памяти продолжает расти. Не достаточно плохо, чтобы разбиться, но все равно не стоит этого делать. Очень загадочно.

ОБНОВЛЕНИЕ 3:

Итак ... наш администратор БД нашел где-то ссылки на тот факт, что было известных утечек памяти в dbms_xmldom и, возможно, в dbms_xslprocessor. Проблемы были исправлены в более новых версиях Oracle, но у нас нет этих версий, и, поскольку нет немедленного плана обновления, мы должны обойти это.

Ответы [ 2 ]

2 голосов
/ 03 мая 2010

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

Изначально я использовал dbms_xmldom для создания XML-документа из частей. Я заменил этот код на операторы SELECT (в ... из двойного) и функции XML: xmlelement, xmlconcat, xmlagg, xmlforest.

Для выполнения преобразования в API XMLType есть функция transform, которую я использовал вместо пакета dbms_xslprocessor. Он работает медленнее, но кажется гораздо более последовательным (по скорости и использованию памяти) и не приводит к сбою системы, когда ему не хватает памяти. :)

1 голос
/ 03 мая 2010

Насколько я понимаю, использование памяти для операций DOM, таких как обработка XSL, имеет тенденцию переходить в 4-ю степень от числа токенов.

Мы также видели сбой обработки XML из-за ошибок нехватки памяти - при обработке XSL, создании документов DOM и т. Д.

Поэтому я рекомендую использовать память вашего администратора базы данных, пока вы выполняете обработку и проверяете, как она масштабируется.

В нашем случае нашей обработке XSL требовалось работать только с относительно небольшой частью документа за раз. Например, мы извлекали данные на 100 000 объектов, а XSL преобразовывал данные на одном объекте. Обрабатывая группы по 1000 или 5000, а затем сшивая итоговый документ, мы смогли значительно ускорить процесс и сократить использование памяти. Поскольку мы извлекали данные из реляционных таблиц с помощью dbms_xmlgen.getXMLType () для создания XML-документа, мы смогли использовать dbms_xmlgen.setMaxRows для установки размера чанка.

Некоторые процессоры XSL, доступные на других языках, сериализуют вещи и обмениваются временем и пространством для использования памяти. Но, насколько я знаю, версия базы данных хочет внести все и обработать ее в целом.

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