MarkLogic 8 – XQuery高效地将大型结果集写入文件

更新:请参阅MarkLogic 8 – 将大型结果集stream到文件 – JavaScript – Node.js客户端API,以获得有关如何在Javascript中执行此操作的答案。 这个问题是专门询问XQuery的。

我有一个Web应用程序,它使用node.js中托pipe的其余服务。

Node简单地将请求代理到XQuery,然后查询MarkLogic。 这些查询已经具有分页设置,并在正常情况下正常工作,以返回一个页面的数据到用户界面。

我需要有一个导出function,当我把一个URL的参数export=all在请求中时,它不再查找一个页面。

在这一点上它应该得到整个结果集,即使它是一百万条logging,并将其保存到一个文件。

实际的请求需要立即返回,说:“当你的下载准备就绪时,我们会通知你。

一个build议是使用xdmp:spawn在后台调用XQuery,将结果保存到文件中。 然后,我的实际的HTTP请求可以立即返回。

对于产卵片,我认为这个想法是,我运行我的查询不同的选项,以获得所有的结果,而不是一页。 然后我将循环访问数据并创build一个stringvariables来调用xdmp:save with。

有些问题,这是一个好主意吗? 有没有更好的办法? 如果我遍历结果集,它确实发生非常大(千兆字节),它可能会导致内存问题。

有没有办法直接将结果stream到XQuery中的文件?

注意:我的另一个想法是拦截代理(节点)层的请求,然后做一个xdmp:估计来获取logging计数,然后循环查询每个页面并将其刷新到磁盘。 在这种情况下,我需要find一些方法来立即返回我的请求,但在后台处理似乎有一些想法在这里: http : //www.pubnub.com/blog/node-background-jobs-async-处理换asynchronous语言/

一个可能的策略是使用自我产卵任务,在每次迭代中,获取查询结果的下一页。

但是,不要直接将结果保存到文件中,而是可以考虑使用xdmp:http-post()将每个页面发送到服务器:

http://docs.marklogic.com/xdmp:http-post?q=xdmp:http-post&v=8.0&api=true

特别是,服务器可以是一个Node.js服务器,当每个页面到达一个文件或任何其他数据链接时,这个服务器会追加每个页面。

这样,Node.js就可以在数据库服务器上以最小的负载来处理长时间运行的asynchronousIO。

当一个自生成的任务到达查询的末尾时,它可以再次使用HTTP请求通知Node.jsclosures文件并报告导出完成。

Hping有帮助,