8

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

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

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

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

谢谢。

4

2 回答 2

9

当您想从 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-querywith some cts:element-querytest。

于 2013-02-04T07:19:51.940 回答
4

有关此错误的一般信息,请参阅有关 XDMP-EXPNTREECACHEFULL的MarkLogic 知识库文章

于 2013-12-17T16:32:17.507 回答