在我正在處理的應用程序中,我必須處理非常大的XML文件(文件大小高達2GB)......我想運行一些XQuery命令這些文件使用Saxon Java庫。java-如何使用Saxon庫處理大型XML文件
我該如何做到這一點,即一次只將文件中的一小部分記錄保存在內存中,並且文件在這些小數據集中處理(而不是一次處理整個文件) - 同時,XQuery命令的輸出應該是正確的?我寧願使用只有0.5GB RAM的機器來運行XQuery命令 - >因此它不可能一次將整個XML加載到內存中。
在我正在處理的應用程序中,我必須處理非常大的XML文件(文件大小高達2GB)......我想運行一些XQuery命令這些文件使用Saxon Java庫。java-如何使用Saxon庫處理大型XML文件
我該如何做到這一點,即一次只將文件中的一小部分記錄保存在內存中,並且文件在這些小數據集中處理(而不是一次處理整個文件) - 同時,XQuery命令的輸出應該是正確的?我寧願使用只有0.5GB RAM的機器來運行XQuery命令 - >因此它不可能一次將整個XML加載到內存中。
達到此功能的最佳方式(但很複雜)是限制可能的XQuery命令(即枚舉所有可能的用例)。之後,每個文件處理一次,使用SAX或StAX方式爲整個XML文件創建一個內部「索引」,該索引將搜索關鍵字映射到XML文件中的偏移量(開始和結束)。這些偏移量應該指向XML文件的一小部分,但格式良好的部分,可以單獨加載並進行分析,以檢查它是否與指定的XQuery匹配。另一種方法是將XML文件解析成一些基於磁盤的臨時數據庫(如Apache Derby),並創建您自己的XQuery => SQL翻譯器或解釋器來訪問此文件數據。另一種方法是將SAX或StAX XML文件解析爲一些基於磁盤的臨時數據庫(如Apache Derby)。你不會得到OutOfMemoryException,但這種方法的性能......可能不是最好用於一次使用的文件。
Saxon對流式處理的支持在XSLT中比在XQuery中更強大,這很大程度上是因爲XSLT工作組在設計XSLT 3.0時一直在解決這個問題。您可以在
http://www.saxonica.com/documentation9.4-demo/index.html#!sourcedocs/streaming
注意找到該產品的流媒體功能,這些信息只提供在商業版,撒克遜-EE。
對於簡單的 「突發模式」 流,你可以做這樣的事情:在薩克森$ë
:流(DOC( 'big.xml')/ * /記錄[@字段= '234'])返回$ e /名稱
「突發模式」本質上是指對源文檔的大量小型不相交子樹進行操作的查詢。
@visergey好的我想我想了解更多關於第一種方式 - 即創建索引,然後加載小部分的XML文件獨立...有沒有任何指南/如何(甚至Java庫或代碼示例)這表明如何做到這一點?謝謝.... – Arvind