2013-02-21 74 views
2

我在uri中有大约15000条xml格式的记录,比如说:“documents/products/specs/*.xml”。 每个xml大小约为25千字节。我连接到该服务器marklogic uisng具有XCC client远程Apache Tomcat服务器(爪哇),它试图执行一个AdHocQuery它类似于这样的事情:Marklogic:查询响应时间非常高

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

(for循环在Java中实现)。

这工作正常。但对于计数较大的记录,如果记录为15000条,则需要60分钟,所有服务器和Internet速度都非常好。 (uri中所有文档的总大小约为20 MB,不应超过20分钟)。

有什么解决方法吗?

+1

15000 * 25 = 375000不是20 MB。 – mblakele 2013-02-21 17:07:36

回答

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 

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

+0

要求是使ms-excel兼容的csv文件代表目录中的所有文件。 – 2013-02-21 12:31:14

+0

所以问这个问题:“我如何最好地制作一个兼容ms-excel的csv文件来代表MarkLogic目录中的所有文档?” – mblakele 2013-02-21 17:03:50

+0

@mblakele:http://stackoverflow.com/questions/15016876/ms-excel-compatible-csv-file-representing-all-documents-in-a-marklogic-directory – 2013-02-22 04:33:24

0

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

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

2

试试这个:

cts:search(
    fn:doc(), 
    cts:document-query(
     cts:uri-match('documents/products/specs/*.xml') 
    ), "unfiltered" 
)