回答
除了推薦的SAX解析,您可以使用包含在JDK(包javax.xml.stream)中的StAX API(一種SAX演變)。
雖然我同意StAX通常是最好的解決方案,但在某些情況下SAX更好。如果您的文檔包含大量文本內容,則AFAIR StAX API將完全讀取內存中的這些文本塊,並將其作爲單個事件處理。 SAX解析器通常會將它分成更小的塊,並將其分段供給處理程序。不保證能夠利用這個機會,但是在StAX中,這個機會甚至不存在。 (我個人覺得對於流媒體API有點尷尬。) – 2010-12-15 13:15:42
問候可以有人請在這裏提高我的理解。因爲我有關於這個問題的面試問題,我回答的關鍵詞是'sax'和'thread',但他仍然需要第三個關鍵詞我回答執行者線程池...他說是和?!〜答案是優先級隊列can some一個解釋如何 – shareef 2015-01-13 17:06:00
@ wilfred-springer Coalesce是一個可以在XMLInputFactory上設置的功能 - StAX API通常以與SAX相同的方式支持此功能。例如參見FasterXML inputfactory。 – ThomasRS 2015-03-05 09:59:50
將文件流式傳輸到SAX解析器中,並以塊爲單位將其讀入內存中。
SAX爲您提供了很多控制,並且事件驅動很有意義。 api有點難以掌握,你必須注意一些事情,比如何時調用了characters()方法,但基本思想是你編寫了一個內容處理程序,當每個程序的開始和結束被調用時讀取xml元素。因此,您可以跟蹤文檔中當前的xpath,確定哪些路徑具有您感興趣的數據,並確定哪條路徑標記了要保存或切換或以其他方式處理的塊的末尾。
使用基於SAX的解析器,它向您顯示事件流中文檔的內容。
正如其他人所說,使用SAX解析器,因爲它是一個流解析器。使用各種事件,您可以根據需要提取信息,然後在其他位置(數據庫,另一個文件,您有什麼)進行存儲。
如果您真的只需要一小部分子集,或者只是簡單歸納文件,您甚至可以將它存儲在內存中。當然取決於用例。
如果您正在假脫機數據庫,確保您採取一些謹慎措施,使您的過程可重新啓動或任何。在1.8GB中可能發生很多可能會在中間失敗的情況。
+1。它比SaX更易於使用,因爲您不需要編寫回調(您基本上只是循環遍歷所有元素,直到完成),並且對於它可以處理的文件的大小(AFAIK)沒有限制。
我有一個類似的問題 - 我不得不讀一個完整的XML文件並在內存中創建一個數據結構。在這個數據結構上(整個事情都必須加載),我不得不做各種操作。很多XML元素包含文本(我必須在輸出文件中輸出這些文本,但對算法來說不重要)。首先,如這裏所建議的,我使用SAX來解析文件並構建我的數據結構。我的文件是4GB,我有一個8GB的機器,所以我認爲可能3GB的文件只是文本和java.lang。對於使用UTF-16的文本,字符串可能需要6GB。
如果JVM佔用比計算機有物理RAM更多的空間,那麼機器將交換。做一個標記+清理垃圾回收會導致頁面以隨機順序訪問,而且對象也會從一個對象池移動到另一個對象池,這基本上會導致機器死機。
因此,我決定把所有的字符串寫入磁盤中的一個文件中(FS顯然可以處理3GB的順序寫入就好了,並且在操作系統中讀取它時將使用可用內存作爲文件系統緩存;可能仍然有隨機訪問讀取,但比java中的GC少)。我創建了一個小幫手類,如果它可以幫助你,歡迎下載:StringsFile javadoc | Download ZIP。
StringsFile file = new StringsFile();
StringInFile str = file.newString("abc"); // writes string to file
System.out.println("str is: " + str.toString()); // fetches string from file
- 1. 解析大型XML文件?
- 2. 解析Android中的大型XML文件
- 3. XML解析器有時無法解析Android上的大型XML文件
- 4. Java-解析大型文本文件
- 5. 解析Java中的大型docx文件
- 6. 解析Java中的大型XML響應
- 7. 的Java XML解析:文件
- 8. 解析大XML文件
- 9. 解析大型xml文件時Java堆空間錯誤
- 10. 如何使用Java解析大型XML文件?
- 11. 解析XML類型文件
- 12. 使用SAX解析器,如何解析java中的xml文件
- 13. 使用SAX解析器解析大型XML文件(跳過一些行/標籤)
- 14. 在SAX解析器中解析大型XML文件時無內存異常
- 15. 解析用java(DOM解析器)多級XML文件
- 16. 在Java中解析大型XML文件時未發現文件異常
- 17. 解析android中的大xml文件
- 18. 解析PHP中的巨大XML文件
- 19. 如何用DOM解析器輕鬆解析大型xml數據?
- 20. 解析Java中的XML文件
- 21. 解析與Java問題的XML文件
- 22. 解析Java中的僞XML文件
- 23. 用Java解析一個大的XML文件
- 24. 如何解析Java中的大(50 GB)XML文件
- 25. 解析非常大的XML文件,並編組爲Java對象
- 26. 用XmlSlurper解析(非常)大型的XML文件
- 27. 解析大型壓縮的xml文件,python
- 28. 我應該如何解析Perl中的大型XML文件?
- 29. 解析Python中的大型僞XML文件
- 30. 如何解析PHP中的大型XML文件?
1.8 gb是一個巨大的文本文件。在文件級不可能把它分成幾塊? – Owen 2010-10-19 15:01:24
@Owen - 這取決於你的域名。當與來自其他人的系統的數據轉儲進行交互時,這種情況可能非常容易發生。 – 2010-10-19 15:03:34
我沒有想到,但我想我們再次需要這樣一個解析器,以避免損壞的XML文件?做這種手動或任何建議怎麼做都不實際? – mehmet6parmak 2010-10-19 15:05:06