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

Marklogic 生成多个线程以删除多个相同元素时出错,marklogic,marklogic-8,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 := f

我想删除重复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)
xquery版本“1.0-ml”;
让$input:=单据(“http://www.somedomain.com/name/12345.xml“”/xpath/toMultipleElement[2到last()]
让$batch size:=50000
let$input size:=fn:count($input)
让$num batches:=xs:int(math:ceil($input size div$batch size))
结果如下:=
{
对于$batch start in(1到$num批次)
让$processing seq:=$input[($batch size*($batch start-1)+1)到($batch size*($batch start))]
回来
xdmp:spawn函数(函数(){
xdmp:节点删除($processing seq),
已删除处理序列
}, 
符合事实的
更新自动提交
)
}
回来
xdmp:save(“D:/batch-wise delete.xml”,$result)

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

我建议您不要尝试删除所有不需要的节点,而是通过一次包含来重建文档

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

本质上——通过在现有文档中的所有节点上递归并返回它们(不需要的节点除外),创建一个新文档。 然后将新文档保存在旧文档之上。
这可以在一个事务中非常有效地完成。

我建议您不要尝试删除所有不需要的节点,而是通过一次包含来重建文档

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

本质上——通过在现有文档中的所有节点上递归并返回它们(不需要的节点除外),创建一个新文档。 然后将新文档保存在旧文档之上。
这可以在一个事务中非常有效地完成。

只需编写一个具有一个子级的新父级,而不是删除所有子级

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>
let$parent:=doc(“http://www.somedomain.com/name/12345.xml/xpath/parent
让$selected child:=$parent/toMultipleElement[1]
返回xdmp:node replace($parent,{$selected child}

不要删除所有子项,只需编写一个有一个子项的新父项即可

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>
let$parent:=doc(“http://www.somedomain.com/name/12345.xml/xpath/parent
让$selected child:=$parent/toMultipleElement[1]
返回xdmp:node replace($parent,{$selected child}

我觉得您正试图从一个长列表中省略元素,并将过滤后的列表保存到磁盘。您不会使用node delete,而是在删除不需要的内容的同时重新构建文档。您能确认吗?@grtjn,实际上xml文件中的一个元素被复制了数百万次,所以我只想保留第一个和第二个元素删除rest all,因此我可以还原原始文档。我正在存储到磁盘的操作报告,即调用delete的次数。消息“无法删除外部节点”与生成相关。您可以传递节点,但您将获得一个副本,无法再更新节点。您必须传递文档uri,然后定位我nfo检索要删除的节点的新副本。但这不是一种有效的方法来删除一个文档中的这么多元素。因此,是否有任何有效的解决方法?是的,请参阅@DALDEI的答案。我有一种印象,您试图从一个长列表中省略元素,并将筛选后的列表保存到磁盘。您不会使用node delete进行删除这是一个错误,但我可以在删除不需要的内容的同时重建文档。你能确认吗?@grtjn,实际上xml文件中的一个元素被复制了数百万次,所以我只想保留第一个元素,并删除其余的所有元素,这样我就可以恢复原始文档。我正在存储到磁盘的操作报告,即调用了多少次delete。message“无法删除外部节点”与生成相关。您可以通过传递节点,但会得到一个副本,无法再更新节点。您必须通过文档uri和位置信息来检索要删除的节点的新副本。但这不是一种有效的方法,无法在一个文档中删除这么多元素。是否有其他方法有效解决此问题是的,请参见@DALDEI.的答案。。