gpt4 book ai didi

xquery - BaseX - 在 XQuery 中使用封闭 xml 时内存不足

转载 作者:行者123 更新时间:2023-12-01 08:49:31 32 4
gpt4 key购买 nike

我一直在尝试查询包含超过 1500000 个项目的 BaseX 数据库。当我运行此查询时

for $item in collection('coll')//item
return $item (: returns an xml element :)

它在不到一秒的时间内执行。

但是当我尝试在 xml 中返回结果时,我收到“Out of main memory”错误。

<xml>{
for $item in collection('coll')//item
return $item
}</xml>

这让我想放弃原生 xml db 方法(其他数据库也一样,例如 eXistDB),所以如果有人知道这个问题的任何信息,那将非常有帮助。

谢谢

最佳答案

由于 XQuery 的语义,如果所有子节点都被新的父节点包裹,则需要复制它们。以下查询证明了这一点,该查询比较了原始节点和复制节点的节点身份。它将产生 false:

let $node := <node/>
let $parent := <parent>{ $node }</parent>
return $parent/node is $node

由于复制数百万个节点的成本很高,这不可避免地会导致内存不足错误。

如果您将结果写入文件,以下是解决此限制的实用解决方案:

(:~ 
: Writes element to a file, wrapped by a root node.
: @param $path path to file
: @param $elements elements to write
: @param $name name of root node
:)
declare function local:write-to(
$path as xs:string,
$elements as element()*,
$name as xs:string
) as empty-sequence() {
file:write-text($path, '<' || $name || '>'),
file:append($path, $elements),
file:append-text($path, '</' || $name || '>')
};

local:write-to('result.xml', <result/>, 'root')

预测批评:这是一个明显的 hack。例如,该方法与BaseX的各种非默认序列化参数冲突(如果需要输出XML声明,则结果格式不正确等)。

关于xquery - BaseX - 在 XQuery 中使用封闭 xml 时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45794599/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com