2016-12-05 149 views
0

據我所知,存儲爲securefile binary xml的xmltype可以處理最大4 GB的文件大小。處理大型XML文檔

我想知道是否有人知道處理大於4 GB xml文件的任何好方法,它們都存儲在數據庫中並讀取\從中選擇數據。

+0

我對xml並不是很熟悉,但我已經考慮循環,在clobsize中獲取大塊節點,並將其存儲在所述塊中。但看到這些文件可能會變得很大,這將需要很長時間。 – Moptan

回答

0

您不應該在Oracle數據庫中存儲如XMLType這樣的大XML文件。

Oracle中的大部分XML函數都基於Document Object Model (DOM),這要求將整個XML文檔加載到內存中,包括大量的開銷數據。即使在大型機器上,這通常會導致內存泄漏或類似問題。

爲了將這樣的XML放到數據庫中,您應該考慮基於流的外部響應,基於事件的XML解析器,通常稱爲SAX (Simple API for XML)。幾乎所有的編程語言都有SAX解析器。然後將XML的內容存儲爲通常的關係數據。從Oracle數據庫創建如此大的XML可以「逐行」地完成到CLOB

PL/SQL APIs for XMLType

這種類型的程序的處理可以通過查看在Oracle XDK Java和C組分SAX接口。

通常,當您使用SAX解析器時,您必須編寫更多代碼,因爲它不提供任何修改或查詢元素。同時還有基於流的解析器可用(例如Perl XML::Twig),它們與基於DOM的解析器一樣強大。

+0

您是否有任何引用解析XML會導致Oracle數據庫中的內存泄漏? – MT0

+0

我發現這一個:[用於XMLType的PL/SQL API](https://docs.oracle.com/cd/B28359_01/appdev.111/b28369/xdb10pls.htm#ADXDB1100):* Oracle Database 11g第1版(11.1)中,Oracle XML DB處理的每個文本節點或屬性值的大小限制爲64 K字節。從版本11.1開始,這個限制不再適用。*在我開發我的應用程序的前一段時間,我認爲這個限制在當時適用。當然,標準的基於DOM的解析器不起作用。 –

+0

而這一個:[XML解析爲Java](https://docs.oracle.com/cd/B28359_01/appdev.111/b28394/adx_j_parser.htm#ADXDK19112)*當程序解析一個大的XML文檔並創建一個DOM樹在內存中,它會影響性能。*對於較早版本:[常見問題(FAQ):PL/SQL的XML解析器](https://docs.oracle.com/cd/A91773_01/ids902dl/web。 902/a88894/adx28ppl.htm#1004621):*您不應該使用DOMParser來解析50Mb XML文件。您需要查看解析任意大小文件的SAXParser,因爲它不會創建內存樹節點。* –