【发布时间】:2018-12-27 17:23:56
【问题描述】:
我有一个要求,我遍历 10,000,000 个文档,并且对于每个文档我执行一些操作并将一些值存储在“/count.xml”中。当我迭代到第二个文档时,我用更新的值更新“/count.xml”
目前这是我正在做的,这里 $total-records 是 10,000,000
let $total-records := xdmp:estimate(cts:search( //some code))
let $batch-size := 5000
let $pagination := 0
let $bs :=
for $records in 1 to fn:ceiling($total-records div $batch-size )
let $start := fn:sum($pagination + 1)
let $end := fn:sum($batch-size + $pagination)
let $_ := xdmp:set($pagination, $end)
return
xdmp:spawn-function
(
function() {
for $each in cts:search( //some code)[$start to $end]
return //some operation and update '/count.xml' with some updated values
},
<options xmlns="xdmp:eval"><commit>auto</commit><update>true</update</options>
)
let $doc := doc("/count.xml")
return ()
所以这里的问题是我需要在迭代所有文档之后读取“/count.xml”文件,但是上面的代码使用 spawn 任务
让 $doc := doc("/count.xml")
不会是最新的,因为上面的 spawn 任务将在不同的线程上运行。
我需要一个解决方案
让 $doc := doc("/count.xml")
等待所有生成任务完成。
我遇到过
<result>{fn:true()}</result>
选项也是如此,但我不知道它是否会起作用,因为变量
$bs
没有在任何地方使用,并且文档说“当调用请求在任何操作中使用值未来时,它将自动等待生成的任务完成并使用结果。”
还有其他选择吗
让 $doc := doc("/count.xml")
只有在所有生成任务完成后才会执行行
【问题讨论】: