我有一个巨大的XML文件(15 GB)。我想将XML文件中的“文本”标签转换为单个页面。巨大的XML文件到文本文件
示例XML文件:
<root>
<page>
<id> 1 </id>
<text>
.... 1000 to 50000 lines of text
</text>
</page>
... Like wise 2 Million `page` tags
</root>
我最初使用DOM解析器,但它MEMORY(有效),将引发JAVA OUT。现在,我已经使用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行。有没有更好的方法来提高性能..?
出于好奇,目前需要多长时间才能加载和解析该文件? –
我已解析2GB文件。花了35分钟.. – user1919035
什么是'pageContent'?它是一个“字符串”吗?如果是这样,一个简单的优化就可以使用'StringBuilder'来代替;它可以追加字符串,而不必像字符串''''='那样创建全新的字符串副本(如果你有一个长度的概念,你也可以用一个初始的保留容量来构造它来减少内存重新分配和副本首先)。 –