2016-08-05 29 views
1

解析大小超過350 MB的XML文件時,我遇到了「java.lang.OutOfMemoryError:JAVA Heap Space」錯誤。XML解析中的內存不足錯誤

PFB代碼片段:在它正試圖評估的最後一行

File file = new File("D:\WS\data.xml"); 
InputSource source = new InputSource(new FileInputStream(file)); 
XPathFactory xPathFact = XPathFactory.newInstance(); 
XPath xPath = xPathFact.newXPath(); 
XPathExpression expr = xPath.compile("//person"); 
NodeList nodeList = (NodeList)expr.evaluate(source, XPathConstants.NODESET); 

我得到的錯誤。

+0

某些XML構造可能非常耗費內存。你能看到xml中的任何可疑內容嗎? – jHilscher

+0

這個論壇帖子可能有用https://community.oracle.com/thread/967427?start=0&tstart=0 – SomeStudent

+0

你試過重啓一切嗎? –

回答

0

你可以嘗試一種更少的內存消耗的方法,以實時處理你的目標節點,而不是讓你的內存中的所有節點都可能導致OOME,如果它們不能適應你的堆,它將只保留目前的一個。

下面是如何將其與XMLDog做到:

XMLDog dog = new XMLDog(null, null, null); 
dog.addXPath("//person"); 
Event event = dog.createEvent(); 
event.setXMLBuilder(new DOMBuilder()); 
event.setListener(new InstantEvaluationListener(){ 
    @Override 
    public void onNodeHit(Expression expression, NodeItem nodeItem){ 
     Node personNode = (Node) nodeItem.xml; 
     // Treat your person node here 
    } 

    @Override 
    public void finishedNodeSet(Expression expression){} 

    @Override 
    public void onResult(Expression expression, Object result){} 
}); 
File file = new File("D:\WS\data.xml"); 
InputSource source = new InputSource(new FileInputStream(file)); 
dog.sniff(event, source, false); 

更多XMLDog here細節。