我在uri中有大约15000个xml格式的记录,比如:“documents/products/specs/*.xml
”。
每个xml的大小约为25千字节。我连接到这个marklogic服务器,使用一个具有XCC client
(Java)的远程Apache Tomcat服务器,它试图执行类似这样的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分钟)。
有没有解决方法?
答案 0 :(得分:2)
试试这个:
cts:search(
fn:doc(),
cts:document-query(
cts:uri-match('documents/products/specs/*.xml')
), "unfiltered"
)
答案 1 :(得分:1)
您正在做的是请求所有文件的全部内容。这不是典型的查询,而是数据库转储。您显示的查询将缓冲所有这些数据,然后通过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
我的猜测(如果我错了,请纠正我)是你只是在试验,实际上并不需要所有的文档。在这种情况下,应该尝试更现实的查询。
答案 2 :(得分:0)
查询花费这么长时间的原因是因为Marklogic服务器正在从磁盘读取,对于大多数这些文件。除非你有一个非常大的树缓存大小。您需要做的是降低查询范围。也许为文件添加一些索引。
所有这一切都说如果您想要做的就是ETL数据输出那么您可能想要批处理请求。