Ошибка XDMP-TOOBIG возникает при использовании xdmp:http-post

У меня есть файл xquery, который возвращает более 2,2 ГБ текстовых данных. Когда я нажимаю файл xquery прямо в браузере (Chrome), он загружает все текстовые данные.

Но когда я пытаюсь сделать пост-вызов в этот файл xquery, используя xdmp:http-post($url,$options) выдает ошибку 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 ответ

При использовании HTTP для вызова внешнего сервера из MarkLogic результат должен помещаться в память, возможно, в несколько копий, в зависимости от того, что вы делаете. Текстовые переменные не оптимизированы для очень больших данных. В зависимости от деталей вашей удаленной службы, вы можете разместить большие данные, используя разбитые на страницы HTTP-запросы (используя Range Request Headers)

Даже если предел 2G будет удален, производительность будет низкой и ненадежной: использование одиночных HTTP-запросов для передачи больших объемов данных становится все более ненадежным, поскольку любые серьезные сетевые ошибки требуют полной повторной попытки.

В качестве альтернативы, служба или локальная прокси-служба могут быть расширены для хранения данных в общем местоположении, таком как смонтированная файловая система или S3, и возврата ссылки на данные вместо ее тела. Затем для доступа к данным можно использовать функции xdmp: filesystem-xxx и xdmp: binary-xxx.

Оказавшись в памяти, манипулирование большими текстовыми данными в виде отдельных строк также будет проблематичным. Если вам нужен доступ к одному большому объекту, то для большей надежности можно использовать двоичные документы (внутренние или внешние).

Если HTTP-запрос может быть преобразован в использование GET, а не POST, тогда xdmp:document-load может использоваться для прямой потоковой передачи результатов в документ.

Комментарии к документации для xdmp:document-load предполагают, что можно использовать префикс "rest:" uri для POST или GET для потоковой передачи результатов непосредственно в базу данных, хотя я не знаю, как таким образом передавать POST.

Другие вопросы по тегам