2014-04-23 69 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 { 
    } 

}