2015-03-24 3 views
2

Я пытаюсь получить все различные начальные элементы /products/p:category/start узлы большого файла. Я написал запрос, который приведен ниже. Это требует времени, чтобы получить результат. Я добавляю информацию о запросе и файл XML.Отличительные узлы, занимающие слишком много времени в BaseX (XQuery)

После нескольких минут работы я прекратил выполнение.

Запрос пытается получить все отдельные элементы запуска. Есть 3 элемента категории lac.

declare namespace functx = "http://www.functx.com"; 
declare namespace p="a:b:c"; 

declare function functx:is-node-in-sequence( 
    $node as node()? , 
    $seq as node()* 
) as xs:boolean { 
    some $nodeInSeq in $seq satisfies deep-equal($nodeInSeq,$node) 
}; 

declare function functx:distinct-nodes( 
    $nodes as node()* 
) as node()* { 
    for $seq in (1 to count($nodes)) 
    return $nodes[$seq] 
     [not(functx:is-node-in-sequence(.,$nodes[position() < $seq]))]} ; 

let $diff_starts := functx:distinct-nodes(/products/p:category/start) 
return $diff_starts 

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

xml file

ответ

2

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

FunctX - это, как правило, аккуратная библиотека, но часто не очень хорошо масштабируется для больших данных, как у вас есть (хотя базы данных XML могут очень хорошо обрабатывать данные намного больше без проблем).

В этом запросе я сначала извлекаю все различные значения в линейном времени (в числе узлов поиска, для получения различных значений BaseX uses a hashtable) и другого линейного сканирования по всем узлам для получения первого результирующего узла для каждого из этих значений , Общее время выполнения на моем ноутбуке было около 700 мс.

declare namespace p="a:b:c"; 
for $date in distinct-values(/products/p:category/start) 
return (/products/p:category/start[. eq $date])[1] 
Смежные вопросы