使用xdmp:http-post时发生XDMP-TOOBIG错误

时间:2016-04-26 14:09:02

标签: marklogic marklogic-7

我有一个xquery文件,它返回超过2.2GB的文本数据。当我直接在浏览器(Chrome)中点击xquery文件时,它会加载所有文本数据。

但是当我尝试使用xdmp:http-post($url,$options)对该xquery文件进行后调用时,它会抛出XDMP-TOOBIG错误。以下是痕迹。

XDMP-TOOBIG: xdmp:http-post("http://server:8278/services/getText...", <options xmlns="xdmp:http"><timeout>600000</timeout><authentication method="basic"><usernam...</options>) -- Document size exceeds text document size limit of 2048 megabytes
in /services/invoke.xqy, at 20:7 [1.0-ml]
$HTTP_CALL = <configurations xmlns:config="" xmlns=""><credentails><username>admin</username><password>admin</password...</configurations>
$userName = text{"admin"}
$password = text{"admin"}
$timeOut = text{"600000"}
$url = "http://server:8278/services/getText..."
$responseType = "text/plain"
$options = <options xmlns="xdmp:http"><timeout>600000</timeout><authentication method="basic"><usernam...</options>
$response = xdmp:http-post("http://server:8278/services/getText...", <options xmlns="xdmp:http"><timeout>600000</timeout><authentication method="basic"><usernam...</options>)
$set-reponse-type = ()

我可以在我使用xdmp的文件中指定的任何限制:http-post或任何其他解决方案?

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

当使用HTTP从MarkLogic内部调用外部服务器时,结果必须适合内存,可能需要多个副本,具体取决于您的操作。 文本变量未针对极大数据进行优化。根据远程服务的详细信息,您可以使用分页的HTTP请求(使用Range Request Headers)来容纳大数据

即使删除了2G限制,性能也会很差且不可靠:使用单个HTTP请求传输大量数据变得越来越不可靠,因为任何严重的网络错误都需要完全重试。

或者,可以扩充服务或本地代理服务以将数据存储在共享位置(例如安装的文件系统或S3)中,并返回对数据的引用而不是其主体。然后xdmp:filesystem-xxx和xdmp:binary-xxx函数可用于访问数据。

一旦进入内存,将大文本数据作为单个字符串进行操作也会出现问题。如果您需要访问单个大型对象,则可以使用二进制文档(内部或外部)来提高可靠性。

如果HTTP请求可以转换为使用GET而不是POST,则可以使用xdmp:document-load直接将结果流式传输到文档中。

xdmp:document-load文档的评论建议人们可以使用&#34;休息:&#34;用于POST或GET的uri前缀直接将结果传输到数据库,虽然我不知道如何通过这种方式传递POST。