2014-04-23 75 views
2

我有大尺寸的XML文件,可以從500 MB到2 GB,我想要做驗證 像自定義標籤和其他驗證的總數。我的問題是有一個很好的方法,以便我編組 完整的xml文件到java對象沒有OutOfMemory異常?我不認爲這是可能的,因爲我有2 GB 的RAM和1536 MB的RAM大小。但是,那麼有什麼選擇?將大型XML文件轉換爲java對象?

我應該使用STAX/SAX將xml分成更小的xml文件,然後有單獨的對象嗎?然後計算每個java對象中的客戶 元素。將它作爲實例變量存儲,然後重複以進一步xml。彙總所有客戶的計數。如果是的話,我將如何知道分解的xml是單個xml的一部分。可能我需要在文件名中引入一些關聯Id ,以便我可以知道單獨的XML節點是單個XML節點的一部分嗎?

+0

是否有可能在內存中建立數據庫?如果是,您可以通過stax/sax讀取xml並將數據存儲到db表中。然後你可以使用sql查詢進行驗證。而H2你將運行在一個單獨的jvm中,所以內存不應該成爲問題。 – Hirak

回答

1

那麼爲了解析你所提到的[size = 2GB]的大小的xml,你不必在RAM中加載所有的大小。您可以使用SAX解析器來解析它。 Here我發現這樣做

XMLReader r = new XMLReader(); 

    r.addHandler("node", new NodeHandler() { 

    @Override 
    public void process(StructuredNode node) { 
     System.out.println(node.queryString("name")); 
     System.out.println(node.queryValue("price").asDouble(0d)); 
    } 
    }); 

    r.parse(new FileInputStream("src/examples/test.xml")); 

Basicaly是SAX和DOM的混合物的一種有趣的方式。它爲您有一些要處理的數據的元素創建do。代碼這是在MIT許可證,可以發現here

如果上面沒有我建議你應該去普通的StAX解析器Here是一個很好的教程入手

1

SAX (Simple API for XML)將有助於可行的你你在這裏。

不同於DOM解析器,SAX解析器不創建XML文檔的一個內存 表示等速度更快,使用較少的存儲器 。相反,SAX解析器通過調用回調,即通過調用提供給解析器的實例的方法來通知客戶端XML文檔 結構。

下面是一個示例實現:凡在MyHandler您定義的動作

SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 
DefaultHandler handler = new MyHandler(); 
parser.parse("file.xml", handler); 

產生類似的文檔/元素的開始/結束的事件時採取。

class MyHandler extends DefaultHandler { 

    @Override 
    public void startDocument() throws SAXException { 
    } 

    @Override 
    public void endDocument() throws SAXException { 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
    } 

    // To take specific actions for each chunk of character data (such as 
    // adding the data to a node or buffer, or printing it to a file). 
    @Override 
    public void characters(char ch[], int start, int length) 
      throws SAXException { 
    } 

}