我试图解析,并在大型xml文件中替换值,每个大小为〜45MB。我这样做的方法是:Java解析大型XML文档
private void replaceData(File xmlFile, File out)
{
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
DocumentBuilder db = df.newDocumentBuilder();
Document xmlDoc = db.parse(xmlFile);
xmlDoc.getDocumentElement().normalize();
Node allData = xmlDoc.getElementsByTagName("Data").item(0);
Element ctrlData = getSubElement(allData, "ctrlData");
NodeList subData = ctrlData.getElementsByTagName("SubData");
int len = subData.getLength();
for (int logIndex = 0; logIndex < len; logIndex++) {
Node log = subData.item(logIndex);
Element info = getSubElement(log, "info");
Element value = getSubElement(info, "dailyInfo");
Node valueNode = value.getElementsByTagName("value").item(0);
valueNode.setTextContent("blah");
}
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
DOMSource s = new DOMSource(xmlDoc);
StreamResult r = new StreamResult(out);
t.transform(s, r);
} catch (TransformerException | ParserConfigurationException | SAXException | IOException e) {
throw e;
}
}
private static Element getSubElement(Node node, String elementName)
{
return (Element)((Element)node).getElementsByTagName(elementName).item(0);
}
我注意到,当我进一步感到沿着for循环需要的条件,并进行了平均10万级节点的需要2个多小时,而如果我只是打破了小长大约1k的大块,它会花费大约10秒。是否有这样的文件被解析的方式效率低下?
---- ----编辑
基于意见和回答这个问题,我切换到使用SAX和XmlStreamWriter。参考/例如:http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/
在转移到使用SAX之后,replaceData函数的内存使用量不会扩展为XML文件的大小,并且XML文件处理时间平均达到了大约18秒。
'dimensionValue'从哪里来的?它去哪里?与“尺寸”一样。 –
对不起,忘了编辑,当我简单的代码。这些值是数组(int [])查找。 – Niru
如果我有类似的问题,我使用一个简单的方法:我让代码运行在调试器中,并经常随机停止它。最经常停靠的地方是最慢的地方。非常简单,非常高效。玩的开心。 –