产生多个线程以删除多个相同元素时出错

时间:2018-11-19 13:41:00

标签: marklogic marklogic-8

我想删除重复的2353218次相同的元素,在xml中仅保留一个。试图产生该过程,但出现以下错误。没有产卵会花费太多时间。请帮忙。

 xquery version "1.0-ml";
    let $input := doc("http://www.somedomain.com/name/12345.xml")/xpath/toMultipleElement[2 to last()]

    let $batch-size := 50000

    let $input-size := fn:count($input)

    let $num-batches :=  xs:int(math:ceil($input-size div $batch-size ))

    let $result :=
    <root>{

    for $batch-start in (1 to $num-batches)
      let $processing-seq := $input[($batch-size * ($batch-start - 1) + 1)  to ($batch-size * ($batch-start ))]
      return

        xdmp:spawn-function(function() {
        xdmp:node-delete($processing-seq),

        <success batch-start='{$batch-start}'> processing sequence deleted</success>
        }, 
        <options xmlns="xdmp:eval">
          <result>true</result>
          <transaction-mode>update-auto-commit</transaction-mode>
        </options>)
    }</root>

    return 
    xdmp:save("D:/batch-wise-delete.xml", $result)

错误:[1.0-ml] XDMP-DELEXTNODES:让$ processing-seq:= $ input [$ batch-size *($ batch-start-1)+1到$ batch-size * $ batch-start] -无法删除外部节点

2 个答案:

答案 0 :(得分:4)

代替删除所有孩子,只需写一个有一个孩子的新父母即可。

let $parent := doc("http://www.somedomain.com/name/12345.xml")/xpath/parent
let $chosen-child := $parent/toMultipleElement[1]
return xdmp:node-replace($parent, <parent>{ $chosen-child }</parent>

答案 1 :(得分:3)

我建议您不要尝试删除所有不需要的节点,而应该通过一次遍历来重建文档。

基本策略在这里https://developer.marklogic.com/blog/xquery-recursive-descent

基本上-通过递归遍历现有文档中的所有节点并返回它们不变的 来排除不需要的节点,从而创建一个新文档。 然后将新文档保存在旧文档上。 这可以非常有效地在一个事务中完成。