Ошибка при создании нескольких потоков для удаления нескольких одинаковых элементов - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу удалить одинаковые элементы, реплицированные 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-мл] XDMP-DELEXTNODES: let $ processing-seq: = $ input [$ batch-size * ($ batch-start - 1) + от 1 до $ batch-size * $ batch-start] - Невозможно удалить внешние узлы

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Вместо удаления всех дочерних элементов просто напишите нового родителя с одним дочерним элементом.

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>
0 голосов
/ 19 ноября 2018

Я рекомендую вместо того, чтобы пытаться удалить все нежелательные узлы, вместо этого вы реконструируете документ путем включения в один проход.

Основная стратегия описана здесь https://developer.marklogic.com/blog/xquery-recursive-descent

по существу -- создать новый документ, повторяя все узлы в существующем документе и возвращая их без изменений , за исключением , исключая нежелательные узлы.затем сохраните новый документ поверх старого.Это можно сделать за одну транзакцию очень эффективно.

...