避免XDMP-EXPNTREECACHEFULL并加载文档

时间:2013-02-04 02:46:45

标签: xquery marklogic

我正在使用marklogic 4,我有大约15000个文档(每个大约10 KB)。我想将整个内容作为文档加载(并将总文档转换为单个csv文件并输出到HTTP输出流以供下载)。当我以这种方式加载文档时:

let $uri := cts:uri-match('products/documents/*.xml')
let $doc := fn:doc ($uri)

xpath大约有15000 xmls。所以 fn:doc 会抛出错误 XDMP-EXPNTREECACHEFULL

这有什么解决方法吗?我无法在管理控制台中增加树缓存大小,因为 products / documents / *。xml 中的xml文件数可能会增加。

感谢。

2 个答案:

答案 0 :(得分:8)

如果要从MarkLogic导出大量XML,最好的方法是编写查询,以便结果可以流式传输,从而完全避免扩展的树缓存。但这是一种非常不同的编码风格:你必须避免任何类型的强类型,并重构代码以删除FLWOR表达式。您将无法测试cq或qconsole中的任何代码。

请查看http://blakeley.com/blogofile/2012/03/19/let-free-style-and-streaming/,了解如何到达目的地的一些提示。您发布的代码示例至少必须成为:

doc(cts:uri-match('products/documents/*.xml'))

顺便说一句,我会尝试重做那个以避免*.xml部分,因为它会比需要的慢。也许是这样的?

cts:search(
  collection(),
  cts:directory-query('products/documents/', 'infinity'))

如果您需要测试除目录之外的其他内容,则可以添加cts:and-query并进行一些cts:element-query测试。

答案 1 :(得分:3)

有关此错误的一般信息,请参阅XDMP-EXPNTREECACHEFULL上的MarkLogic knowledge base article