我正在使用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文件数可能会增加。
感谢。
答案 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