【问题标题】:MarkLogic 8 - XQuery write large result set to a file efficientlyMarkLogic 8 - XQuery 有效地将大型结果集写入文件
【发布时间】:2015-08-26 04:24:22
【问题描述】:

更新:请参阅MarkLogic 8 - Stream large result set to a file - JavaScript - Node.js Client API 以获取有关如何在 Javascript 中执行此操作的答案。这个问题专门询问 XQuery。

我有一个使用 node.js 中托管的 rest 服务的 web 应用程序。

Node 只是将请求代理到 XQuery,然后 XQuery 查询 MarkLogic。 这些查询已经设置了分页,并且在正常情况下可以正常工作以将一页数据返回给 UI。

我需要有一个导出功能,这样当我在请求中添加export=all 的 URL 参数时,它就不再查找页面了。

此时它应该获取整个结果集,即使是一百万条记录,并将其保存到文件中。

实际的请求需要立即返回,说“当您的下载准备好时,我们会通知您。”

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

对于生成部分,我认为我的想法是使用不同的选项运行查询,以便获得所有结果而不是一页。然后我会遍历数据并创建一个字符串变量来调用 xdmp:save 。

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

有没有办法直接将结果流式传输到 XQuery 中的文件?

注意:我的另一个想法是在代理(节点)层拦截请求,然后执行 xdmp:estimate 以获取记录数,然后循环查询每个页面并将其刷新到磁盘。在这种情况下,我需要找到一些方法来立即返回我的请求,但在节点的后台处理,这似乎有一些想法:http://www.pubnub.com/blog/node-background-jobs-async-processing-for-async-language/

【问题讨论】:

    标签: node.js xquery marklogic


    【解决方案1】:

    一种可能的策略是使用自生成任务,该任务在每次迭代时获取查询结果的下一页。

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

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

    特别是,服务器可以是 Node.js 服务器,在每个页面到达文件或任何其他数据接收器时将其附加到它。

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

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

    Hping 有帮助,

    【讨论】:

    • 我认为这基本上就是我在底部注释中所说的?
    • 也许我理解错了。我认为问题末尾的注释是提议从 MarkLogic 拉入 Node.js(这也可以);上面的答案建议从 MarkLogic 推送到 Node.js。
    猜你喜欢
    • 2015-08-23
    • 2011-11-08
    • 2018-05-19
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多