Xquery MarkLogic:处理文档以添加属性的超时

Xquery MarkLogic:处理文档以添加属性的超时,xquery,marklogic,Xquery,Marklogic,MarkLogic:9.8.0 我们需要大约2000万的数据,现在我们需要在文档属性中添加额外的数据 所以我们已经设置了调度程序&下面的代码将被执行 let $Log := xdmp:log("[ Project ][ Scheduler ][ Start ][ ======================== Insert Records Scheduler Start ======================== ]") for $author in (/autho

MarkLogic:9.8.0

我们需要大约2000万的数据,现在我们需要在文档属性中添加额外的数据

所以我们已经设置了调度程序&下面的代码将被执行

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)}
let$Log:=xdmp:Log(“[Project][Scheduler][Start][==================================================================================================================================”)
$author in(/author][not(property::root/contributors)])[1到500]
让$uri:=$author/base-uri()
让$auth_元素:=if($author/aug)
然后
对于$auth,在$author/aug/pname中
让$snm:=$auth/snm/text()
让$fnm:=fn:concat(fn:string连接(对于$auth/fnm中的$i,返回$i,,“”)
返回
{fn:normalize space(fn:concat($snm,,$fnm))}
else if($author/edit)
然后
对于$auth中的$auth/pname
让$snm:=$auth/snm/text()
让$fnm:=fn:concat(fn:string连接(对于$auth/fnm中的$i,返回$i,,“”)
返回
{fn:normalize space(fn:concat($snm,,$fnm))}
else()
让$XmlDoc:={$auth_元素}
回击{
xdmp:文档添加属性($uri,$XmlDoc),
xdmp:log(“[InspecDirect][Scheduler][End][============================================================================================================================================================]插入记录计划程序端”)
}
捕获($e){xdmp:log($e)}
当我们从[1到500]更改为[1到10000]时,这里会出现超时错误。 如果我们选择500,那么需要几个星期才能完成

您能告诉我这种方法是否合适吗?

可能是更好的解决方案。您可以使用当前的XQuery并将其分成两部分。第一部分将收集需要更新的URI

第二部分将URI作为输入,并相应地进行处理。这允许在不超时的情况下处理非常大的批次


您还可以使用MarkLogic提供的DHF 5框架,在该框架中,您可以通过指定批大小和线程大小来管理批处理中处理的文档数量,线程大小将负责并行高效地运行流程。此框架将帮助您减少超时错误


问题中的代码使用单个线程来攻击问题。Corb2将把工作负载分成许多小批量,并运行可配置数量的线程来并行处理它们。对于Corb2来说,处理2000万条记录应该不是一件难事。。