#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 в качестве входных данных и обрабатывает его соответствующим образом. Это позволяет обрабатывать очень большие пакеты без тайм-аутов.
Комментарии:
1. Код в вопросе решает проблему одним потоком. Corb2 разбивает рабочую нагрузку на множество небольших пакетов и запускает настраиваемое количество потоков для их параллельной обработки. Обработка 20 миллионов записей не должна быть проблемой для Corb2..
Ответ №2:
Вы также можете использовать фреймворк DHF 5, предоставляемый MarkLogic, в котором вы можете управлять количеством документов, обрабатываемых в пакете, задав размер пакета, а также размер потока, который позаботится о параллельном и эффективном выполнении процесса. Эта структура поможет вам уменьшить количество ошибок тайм-аута.