我有一个巨大的 XML 文件 (15 GB)。我想将 XML 文件中的“文本”标签转换为单个页面。
示例 XML 文件:
<root>
<page>
<id> 1 </id>
<text>
.... 1000 to 50000 lines of text
</text>
</page>
... Like wise 2 Million `page` tags
</root>
我最初使用 DOM 解析器,但它抛出 JAVA OUT OF MEMORY(Valid)。现在,我已经使用 STAX 编写了 JAVA 代码。它运行良好,但性能确实很慢。
这是我写的代码:
XMLEventReader xMLEventReader = XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(filePath));
while(xMLEventReader.hasNext()){
xmlEvent = xMLEventReader.nextEvent();
switch(xmlEvent.getEventType()){
case XMLStreamConstants.START_ELEMENT:
if( element == "text")
isText = true;
break;
case XMLStreamConstants.CHARACTERS:
chars = (Characters) xmlEvent;
if(! (chars.isWhiteSpace() || chars.isIgnorableWhiteSpace()))
if(isText)
pageContent += chars.getData() + '\n';
break;
case XMLStreamConstants.END_ELEMENT:
String elementEnd = (((EndElement) xmlEvent).getName()).getLocalPart();
if( elementEnd == "text" )
{
createFile(id, pageContent);
pageContent = "";
isText = false;
}
break;
}
}
此代码运行良好。(忽略任何小错误)。根据我的理解,XMLStreamConstants.CHARACTERS 为文本标记的每一行进行迭代。如果 TEXT 标记中有 10000 行,XMLStreamConstants.CHARACTERS 将迭代接下来的 10000 行。有没有更好的方法来提高性能..?
最佳答案
我可以看到一些可能对您有所帮助的解决方案:
- 使用
BufferedInputStream
而不是简单的FileInputStream
来减少磁盘操作的次数 - 考虑使用
StringBuilder
来创建您的 pageContent 而不是字符串连接。 - 增加您的 Java 堆(
-Xmx
选项)以防您的 2GB 示例内存受限。
在这种情况下,连接代码分析器(例如 Java VisualVM )可能会非常有趣,因为您可以准确地看到代码中哪些方法调用缓慢。然后,您可以适本地关注优化。
关于java - 巨大的 XML 文件到文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22241841/