MarkLogic CORB - 运行 corb 时如何避免超时

MarkLogic CORB - How to avoid timeout when run corb

如何在运行大批量数据拉取过千万文档pdf/xml时如何避免CORB超时?我需要减少线程数和批处理大小吗?

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

如果您共享 CoRB 作业选项和 URIS-MODULEPROCESS-MODULE[= 的代码,诊断和改进建议会更容易30=]

CoRB 作业的一般概念是拆分工作以执行多个模块执行,而不是尝试在一次执行中完成所有工作,以避免超时问题和过多的内存消耗。

例如,如果你想下载 1000 万个文档,URIS-MODULE 将 select 所有这些文档的 URI,然后每个 URI 将被发送到 PROCESS-MODULE,它将负责检索它。根据 THREAD-COUNT,您可以一次下载多个文档,但它们应该都很快返回。

是URIs模块执行超时,还是进程模块?

您可以将超时限制从默认限制增加到最大超时限制,方法是:xdmp:request-set-time-limit()

一般来说,进程模块应该快速执行并且不应该超时。一个可能的原因是在转换中执行太多工作(即设置 BATCH-SIZE 非常大并且一次做太多)或者可能是配置错误或查询编写不当(即而不是获取具有 $URI 值的单个文档,每次执行流程模块时执行搜索并检索所有文档)。