2010-03-19 90 views
2

我在具有以下要求的應用程序的工作處理XML文件 -與龐大的數據

  1. 從服務器下載一個ZIP文件。
  2. 解壓縮ZIP文件,從該文件獲取內容(XML格式)爲字符串。
  3. 將此內容傳遞給另一個解析和進一步處理的方法。

現在,我的關注點是XML文件的大小可以說是'100MB',而我的JVM只有512 MB的內存,所以我怎樣才能將這些內容加入到塊中並傳遞給Parsing和然後將數據插入到PL/SQL表中。

由於可以同時運行多個請求並考慮512MB內存,因此最好能夠處理該請求。

如何將數據獲取到Chunks中並將其作爲Stream傳遞給XML解析。

+0

dupe of http://stackoverflow.com/questions/504689/big-xml-file-and-outofmemoryerror http://stackoverflow.com/questions/1913551/huge-xml-file-do-i-read-一個頁面和每個進程處理它http://stackoverflow.com/questions/23106/best-method-to-parse-various-custom-xml-documents-in-java http:// stackoverflow。 com/search?q = huge + xml + java – voyager 2010-03-19 21:30:01

+0

另請參閱:http://stackoverflow.com/questions/1134189/can-jaxb-parse-large-xml-files-in-chunks – Ash 2010-03-19 21:31:40

+0

另請參閱http:// stackoverflow .com/questions/2013996/large-xml-files-and-pagination-is-it-possible – 2010-03-19 22:47:24

回答

3

任何SAX解析器都應該工作,因爲它不會像DOM解析器一樣將整個XML文件加載到內存中。

5

Java's XMLReader是一個SAX2解析器。在DOM解析器讀取整個XML文件並創建(通常是大型)數據結構(通常是樹)來表示其內容的情況下,SAX解析器可讓您註冊一個處理程序,該程序將在XML文檔的部分認可。在該回調代碼中,您只能保存足夠的數據來執行所需的操作 - 例如您可能會保存所有將以數據庫中的單行結束的字段,插入該行並丟棄數據。使用這種類型的設計,程序的內存消耗量取決於文件大小,而不是單個邏輯數據項的複雜性和大小(在您的情況下,數據將成爲數據庫中的一行)。

即使您確實使用了DOM風格的解析器,事情可能並不像您期望的那麼糟糕。 XML非常詳細,所以(取決於它的結構和方式)一個100 MB的文件通常只代表10-20 MB的數據,而低至5 MB的數據不會特別少見或難以置信。

+0

感謝您的回覆。 但我的主要要求是我不想將所有數據加載到內存中,而是必須讀取Chunks中的一小部分XML文件,並將它傳遞給其他某個應用程序進行處理以避免內存不足錯誤.... – 2010-03-19 21:43:41

+1

@Manish:這就是爲什麼我(以及其他給你答覆的人)推薦使用SAX風格的解析器 - 它從不試圖將整個文件加載到內存中。 – 2010-03-19 22:03:45

+0

嗨傑裏, 其實在我的要求中,我必須從服務器下載文件並將XML數據轉換爲字符串,這個字符串我必須傳遞給解析XML的其他應用程序。 我可以有一些機制,在從服務器下載文件的過程中,我可以將這些數據塊傳遞給其他應用程序? – 2010-03-19 23:54:07