我是一个有用的助手,可以翻译文本。
我最初使用了DOM解析器,但它会抛出JAVA OUT OF MEMORY(Valid)错误。现在,我已经使用STAX编写了JAVA代码。它可以正常运行,但性能非常慢。
这是我编写的代码:
这段代码工作得很好(忽略任何小错误)。根据我的理解,XMLStreamConstants.CHARACTERS枚举逐行迭代文本标签。如果TEXT标签中有10000行,则XMLStreamConstants.CHARACTERS将迭代下一行10000次。是否有更好的方法来提高性能..?
我有一个巨大的 XML 文件(15 GB)。我想将 XML 文件中的“text”标签转换为单个页面。
示例 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次。是否有更好的方法来提高性能..?
pageContent
是什么?它是一个String
吗?如果是,一个简单的优化方式是立即使用StringBuilder
,它可以附加字符串而无需像String
的+=
那样完全创建新的字符串副本(你还可以使用初始保留容量来构造它,以减少内存重新分配和复制,如果你已经有了长度的想法)。 - Jason C