MarkLogic: Время ожидания для обработки документа для добавления свойств

#xquery #marklogic

#xquery #марклогик

Вопрос:

MarkLogic: 9.8.0

У нас около 20 миллионов данных, и теперь нам нужно добавить дополнительные данные в свойства документа.

Итак, у нас есть планировщик настроек, и будет выполнен приведенный ниже код

 let $Log := xdmp:log("[ Project ][ Scheduler ][ Start ][ ======================== Insert Records Scheduler Start ======================== ]")

for $author in (/author][not(property::root/contributors)])[1 to 500]

let $uri           := $author/base-uri()
let $auth_element  := if ($author/aug)
                      then
                           for $auth in $author/aug/pname
                               let $snm := $auth/snm/text()
                               let $fnm := fn:concat(fn:string-join(for $i in $auth/fnm return $i,' '),'')
                               return
                                     <pname type='author'>{fn:normalize-space(fn:concat($snm,' ',$fnm))}</pname>
                      else if ($author/editg)
                      then
                           for $auth in $author/pname
                               let $snm := $auth/snm/text()
                               let $fnm := fn:concat(fn:string-join(for $i in $auth/fnm return $i,' '),'')
                               return
                                     <pname type='editor'>{fn:normalize-space(fn:concat($snm,' ',$fnm))}</pname>
                      else ()
let $XmlDoc := <root><contributors>{$auth_element}</contributors></root>             
        
return try{
            xdmp:document-add-properties($uri,$XmlDoc),
            xdmp:log("[ InspecDirect ][ Scheduler ][ End ][ ======================== Insert Records Scheduler End ======================== ]")
            }
       catch($e){xdmp:log($e)}
 

Когда мы переходим с [1 на 500] на [1 на 10000], мы получаем ошибку тайм-аута здесь.
И если мы пойдем с 500, то на его завершение уйдут недели.

Не могли бы вы сообщить мне, подходит ли этот подход?

Ответ №1:

Corb2, вероятно, будет лучшим решением. Вы можете взять свой текущий XQuery и разделить его на две части. Первая часть будет собирать URI, которые необходимо обновить.

Вторая часть принимает URI в качестве входных данных и обрабатывает его соответствующим образом. Это позволяет обрабатывать очень большие пакеты без тайм-аутов.

Corb2 Wiki

Corb2 Github

Комментарии:

1. Код в вопросе решает проблему одним потоком. Corb2 разбивает рабочую нагрузку на множество небольших пакетов и запускает настраиваемое количество потоков для их параллельной обработки. Обработка 20 миллионов записей не должна быть проблемой для Corb2..

Ответ №2:

Вы также можете использовать фреймворк DHF 5, предоставляемый MarkLogic, в котором вы можете управлять количеством документов, обрабатываемых в пакете, задав размер пакета, а также размер потока, который позаботится о параллельном и эффективном выполнении процесса. Эта структура поможет вам уменьшить количество ошибок тайм-аута.

https://docs.marklogic.com/datahub/5.2/