2

我在 uri 中有大约 15000 条 xml 格式的记录,比如:“ documents/products/specs/*.xml”。每个 xml 的大小约为 25 千字节。我使用一个远程 Apache Tomcat 服务器连接到这个 marklogic 服务器,该服务器有一个XCC client(Java),它试图执行一个AdHocQuery类似于这样的东西:

let $a := cts:uri-match('documents/products/specs/*.xml')
          for $xml in $a
          return fn:doc($a)

(for循环在java中实现)。

这工作正常。但是对于数量较多的记录,比如 15000 条记录,需要 60 分钟,此时所有服务器和互联网速度都非常好。(uri 中所有文档的总大小约为 20 MB,不应超过 20 分钟)。

有什么解决方法吗?

4

3 回答 3

2

尝试这个:

cts:search(
    fn:doc(),
    cts:document-query(
        cts:uri-match('documents/products/specs/*.xml')
    ), "unfiltered"
)
于 2013-03-12T18:02:23.553 回答
1

您正在做的是请求所有文件的全文。这不是典型的查询,而是数据库转储。您显示的查询将缓冲所有这些数据,然后通过 tomcat 发送它,tomcat 再次缓冲所有数据,然后将其发送给您。这是一个要在一个请求中发送的大型数据集。

您查询的目的是什么?如果您想获取所有文档,您应该使用诸如 mlcp 之类的程序将它们转储出来,或者通过首先收集 URI 然后获取文档来分批获取它们。这可以通过并行获取文档来大大加快速度。您可以在 xmlsh 中查看 Java 源代码示例,该示例展示了如何在 XCC 中并行获取文档

http://xmlsh.svn.sourceforge.net/viewvc/xmlsh/extensions/marklogic/src/org/xmlsh/marklogic/get.java?revision=792&view=markup

我的猜测(如果我错了,请纠正我)是您只是在试验,实际上并不需要所有文档。在这种情况下,应该尝试更实际的查询。

于 2013-02-21T11:57:40.283 回答
0

查询花费这么长时间的原因是 Marklogic 服务器正在从磁盘读取大多数这些文件。除非你有一个非常大的树缓存大小。您需要做的是缩小查询范围。也许为文件添加一些索引。

所有这一切,如果你想做的只是 ETL 数据,那么你可能想要批量处理请求。

于 2013-03-01T20:54:37.123 回答