我是XQuery和MarkLogic的新手。
我正在尝试更新MarkLogic中的文档并获取扩展树缓存已满错误。
为了完成工作,我增加了扩展的树缓存,但是不建议这样做。
我想调整此查询,以便它不需要同时缓存尽可能多的XML。

这是我的查询

我将查询上传为图像,因为当我将其粘贴到编辑器上时,它不是那么漂亮。如果有人知道更好的方法,请提出建议。

提前致谢。

最佳答案

我刚刚解决了这种情况。我做了两件事


我将node-replace和node-insert类型调用(即将XML结构修改的任何调用放入单独的模块,然后使用xdmp:invoke调用该模块,并传入所需的任何参数,例如这样的调用)

让$ update:= xdmp:invoke(“ / app / lib / update-attribute-node.xqy”,
(xs:QName(“ newValue”),$ new),
{xdmp:modules-database()})


之所以起作用,是因为对xdmp:invoke的调用发生在它自己的事务中,并且一旦完成,便清除了内存。如果您不这样做,那么每次调用update或insert函数时,它实际上都不会执行写操作,直到单个事务结束时,这意味着您的内存将很快填满。


每当我需要遍历MarkLogic中的路径(或文档或任何称为它们的路径-我仅使用MarkLogic几天),并且有很多路径时,我一次只处理了几次,如下所示。我想出了一种精心设计的方法,一次可以跳过和仅处理一批文档,但是您可以采用多种方法来完成。

让$ whatever:= xdmp:directory(“ / whatever /”)[$ start to $ end]


我还将其放在单独的模块中,以便立即处理而不是在单个事务中处理。

将所有昂贵的调用放入单独的模块中,一次仅获取大数据集的一个子集,可以帮助我解决扩展的树缓存全部错误。

关于caching - 需要帮助重写XQuery以避免MarkLogic中扩展的树缓存已满错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23016289/

10-12 16:45