2016-04-26 77 views
5

我有一個xquery文件,它返回的文本數據超過2.2GB。當我在瀏覽器(Chrome)中直接點擊xquery文件時,它會加載所有文本數據。使用xdmp時發生XDMP-TOOBIG錯誤:http-post

但是,當我嘗試使用xdmp:http-post($url,$options)對該xquery文件進行post調用時,會引發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發佈或任何其他解決辦法?

幫助表示讚賞。

+0

如錯誤消息所示,您不能擁有大於2048MB的文本文檔。也許如果你更多地解釋你想要完成的是什麼,而不是你的特定實現,那麼有人可以提出一個可行的選擇。 –

+0

以前我們曾經打過一個URL「server:8278/services/getText.xqy(Mocked)」,它返回的文本數據的響應類型爲text/plain。這返回超過2 GB。但是現在這段代碼被移到了aws集羣中,在那裏我們沒有端口8278的訪問權限。但是我們可以從一個有權訪問aws的端口對該端口進行http調用。在invoke.xqy中,我使用了xdmp:http-post()函數,這意味着invoke.xqy就像代理一樣。這適用於有限的數據,如果超過2GB返回,則會出現TOOBIG錯誤。任何解決方案? – Karthick

回答

0

當使用HTTP從MarkLogic內部調用外部服務器時,結果必須符合內存,可能需要多個副本,具體取決於您的操作。 文本變量未針對超大型數據進行優化。根據遠程服務的詳細信息,您可以使用分頁的HTTP請求來容納大量數據(使用Range Request Headers

即使刪除了2G限制,性能也會很差且不可靠:使用單個HTTP請求傳輸大量的數據變得越來越不可靠,因爲任何嚴重的網絡錯誤都需要全面重試。

或者,可以增加服務或本地代理服務以將數據存儲在共享位置(例如安裝的文件系統或S3)中,並返回對數據的引用而不是其主體。然後可以使用xdmp:filesystem-xxx和xdmp:binary-xxx函數來訪問數據。

一旦進入內存,將大型文本數據作爲單個字符串操作也會產生問題。如果您需要訪問單個大對象,則可以使用二進制文檔(內部或外部)以獲得更好的可靠性。

如果可以將HTTP請求轉換爲使用GET而不是POST,則可以使用xdmp:document-load將結果直接傳輸到文檔中。

關於xdmp:document-load文檔的評論建議您可以使用POST或GET的「rest:」uri前綴直接將結果流式傳輸到數據庫,但我不知道如何以這種方式傳遞POST。