700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java – 巨大的XML文件到文本文件

java – 巨大的XML文件到文本文件

时间:2019-07-03 17:56:11

相关推荐

java – 巨大的XML文件到文本文件

我有一个巨大的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(有效).现在,我使用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?它似乎是一个字符串.立即进行一个简单的优化就是使用StringBuilder;它可以附加字符串,而不必像Strings =那样创建字符串的全新副本(如果您对开始的长度有所了解,也可以使用初始保留容量来构建它以减少内存重新分配和副本).

连接字符串是一个缓慢的操作,因为字符串在Java中是不可变的;每次调用a = b时,它必须分配一个新字符串,将a复制到其中,然后将b复制到其末尾;使每个连接O(n)wrt.两个字符串的总长度.附加单个字符也是如此.另一方面,StringBuilder在追加时具有与ArrayList相同的性能特征.那你在哪里:

pageContent = chars.getData() "\n";

而是将pageContent更改为StringBuilder并执行:

pageContent.append(chars.getData()).append("\n");

此外,如果您猜测其中一个字符串的长度的上限,则可以将其传递给StringBuilder构造函数以分配初始容量并减少内存重新分配和完整复制的可能性.

顺便说一下,另一个选择是完全跳过StringBuilder并将数据直接写入输出文件(假设您不是先处理数据).如果执行此操作,并且性能受I / O限制,则在不同的物理磁盘上选择输出文件可能会有所帮助.

来源:/content-1-488101.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。