我有一个相当大的XML文件(~280 MB),XML文件中的每一行都有很多属性,我想从中提取3个属性并将其存储在某处。但是当我这样做时,我的内存耗尽了。我的代码如下所示:
File xmlFile = new File(xml);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = null;
try {
doc = dBuilder.parse(xmlFile);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
NodeList nList = doc.getElementsByTagName("row");
for (int index = 0; index < nList.getLength(); index++) {
Node nNode = nList.item(index);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
System.out.print("F1 : " +
nNode.getAttributes().getNamedItem("F1").getTextContent());
System.out.print(" F2: " +
nNode.getAttributes().getNamedItem("F2").getTextContent());
System.out.println(" F3: " +
nNode.getAttributes().getNamedItem("F3").getTextContent());
}
}
这是我得到的错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeObject(DeferredDocumentImpl.java:974)
at com.sun.org.apache.xerces.internal.dom.DeferredElementImpl.synchronizeData(DeferredElementImpl.java:121)
at com.sun.org.apache.xerces.internal.dom.ElementImpl.getTagName(ElementImpl.java:314)
at com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.nextMatchingElementAfter(DeepNodeListImpl.java:199)
at com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.item(DeepNodeListImpl.java:146)
at com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.getLength(DeepNodeListImpl.java:117)
at Parser.parsePosts(Parser.java:55)
at Parser.main(Parser.java:72)
如何更改它以防止过多空间?
编辑: 用SAX写了一个新的解析器,好像完成了工作。代码是:
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
public void startElement(String uri, String localName,String qName,
Attributes attributes) throws SAXException {
System.out.print(attributes.getValue("F1") + " ");
System.out.print(attributes.getValue("F2") + " ");
System.out.println(attributes.getValue("F3"));
}
};
saxParser.parse("file.xml", handler);
} catch (Exception e) {
e.printStackTrace();
}
答案 0 :(得分:2)
有两种方法可以解决您的问题。您可以增加应用程序的最大内存,也可以使用sax来解析xml文件。
答案 1 :(得分:1)
在运行时尝试使用参数-Xmx<size>
来增加堆的大小。
,例如java -Xmx500m <filename>
答案 2 :(得分:0)
您必须增加Java VM的内存限制:设置-Xmx = 2048或其他足够大的值。