MarkLogic CORB - Как избежать тайм-аута при запуске corb
Как избежать тайм-аута CORB при запуске большого пакета данных, превышающего 10 миллионов документов pdf/xml? Нужно ли мне уменьшить количество потоков и размер пакета.
uris-модуль:
let $uris := cts:uris(
(),
(),
cts:and-query((
cts:collection-query("/sites"),
cts:field-range-query("cdate","<","2019-10-01"),
cts:not-query(
cts:or-query((
cts:field-word-query("dcax","200"),
more code...,
))
)
))
return (fn:count($uris), $uris)
process.xqy:
declare variable $URI as xs:string external;
let $uris := fn:tokenize($URI,";")
let $outputJson := "/output/json/"
let $outputPdf := "/output/pdf/"
for $uri1 in $uris
let $accStr := fn:substring-before(fn:substring-after($uri1,"/sites/"),".xml")
let $pdfUri := fn:concat("/pdf/iadb/",$accStr,".pdf")
let $doc := fn:doc($uri1)
let $obj := json:object()
let $_ := map:put($obj,"PaginationOrMediaCount",fn:number($doc/rec/MediaCount))
let $_ := map:put($obj,"Abstract",fn:replace($doc/rec/Abstract/text(),"[^a-zA-Z0-9 ,.\-\r\n]",""))
let $_ := map:put($obj,"Descriptors",json:to-array($doc/rec/Descriptor/text()))
let $_ := map:put($obj,"FullText",fn:replace($doc/rec/FullText/text(),"[^a-zA-Z0-9 ,.\-\r\n]",""))
let $_ := xdmp:save(
fn:concat($outputJson,$accStr,".json"),
xdmp:to-json($obj)
)
let $_ := if (fn:doc-available($pdfUri))
then xdmp:save(
fn:concat($outputPdf,$accStr,".pdf"),
fn:doc($pdfUri)
)
else ()
return $URI
1 ответ
Было бы легче диагностировать и предлагать улучшения, если бы вы поделились параметрами задания CoRB и кодом для своих URIS-MODULE и PROCESS-MODULE.
Общая концепция задания CoRB заключается в разделении работы для выполнения нескольких модулей, а не в попытке выполнить всю работу за одно выполнение, чтобы избежать проблем с тайм-аутом и чрезмерного потребления памяти.
Например, если вы хотите загрузить 10 миллионов документов, URIS-MODULE выберет URI всех этих документов, а затем каждый URI будет отправлен в PROCESS-MODULE, который будет отвечать за его получение. В зависимости от THREAD-COUNT, вы можете загружать несколько документов одновременно, но все они должны возвращаться очень быстро.
Время выполнения модуля URI истекло, или модуля процесса?
Вы можете увеличить лимит тайм-аута от лимита по умолчанию до максимального лимита тайм-аута, используя: xdmp:request-set-time-limit()
Как правило, модули процессов должны выполняться быстро и без задержки. Одной из возможных причин может быть выполнение слишком большого объема работы в преобразовании (например, установка действительно большого размера BATCH-SIZE и выполнение слишком большого количества одновременно) или, возможно, неправильная конфигурация или плохо написанный запрос (т.е. вместо получения одного документа со значением $URI, выполнение поиск и получение всех документов при каждом запуске модуля процесса).