当前位置:编程学习 > JAVA >>

大容量XML文件解析

<?xml version = '1.0' encoding = 'GBK'?>
<root>
<record>
<node1 id = 'id_1' name = 'name_1'/>
<node2 id = 'id_2' name = 'name_2'/>
<node3 id = 'id_3' name = 'name_3'/>
<node4 id = 'id_4' name = 'name_4'/>
</record>
<record>
<node1 id = 'id_1' name = 'name_1'/>
<node2 id = 'id_2' name = 'name_2'/>
<node3 id = 'id_3' name = 'name_3'/>
<node4 id = 'id_4' name = 'name_4'/>
</record>
<record>
<node1 id = 'id_1' name = 'name_1'/>
<node2 id = 'id_2' name = 'name_2'/>
<node3 id = 'id_3' name = 'name_3'/>
<node4 id = 'id_4' name = 'name_4'/>
</record>
<record>
<node1 id = 'id_1' name = 'name_1'/>
<node2 id = 'id_2' name = 'name_2'/>
<node3 id = 'id_3' name = 'name_3'/>
<node4 id = 'id_4' name = 'name_4'/>
</record>......<root>



各位大侠,最近项目遇到一个XML解析的问题,就是一个大容量的XML文件,可能300M+,XML格式如上代码,要一次加载到内存解析不现实,基本上不可行,现想根据record的个数解析,比如说一次加载100个rocord来解析,然后依次类推这样下去,不知道有没有可行的解决方案,希望各位能给点意见,谢谢! 
--------------------编程问答-------------------- SAX解析。简单说就是边读边解析。你可以在网上找下这方面的东东很多。 --------------------编程问答-------------------- stax
javax.xml.stream.*
javax.xml.stream.events.* --------------------编程问答-------------------- http://topic.csdn.net/u/20110707/20/e7f02957-c860-4c36-bb6f-ce99736bfdf8.html --------------------编程问答-------------------- SAX我也试过,但是要是节点数过多超过232M的时候就内存泄露了,一时找不到原因,希望各位大侠能给点具体的意见,谢谢 --------------------编程问答--------------------
引用 4 楼 mytest114 的回复:
SAX我也试过,但是要是节点数过多超过232M的时候就内存泄露了,一时找不到原因,希望各位大侠能给点具体的意见,谢谢


这很可能不是SAX的问题,而是你自己实现的问题,换句话说,SAX是逐行读取的,但是你却把它们全部读取出来再处理的,再仔细分析你的代码。 --------------------编程问答--------------------
引用 5 楼 spiniper 的回复:
引用 4 楼 mytest114 的回复:

SAX我也试过,但是要是节点数过多超过232M的时候就内存泄露了,一时找不到原因,希望各位大侠能给点具体的意见,谢谢


这很可能不是SAX的问题,而是你自己实现的问题,换句话说,SAX是逐行读取的,但是你却把它们全部读取出来再处理的,再仔细分析你的代码。

+1 --------------------编程问答-------------------- 恩,我也觉得是的,一直在找原因 --------------------编程问答--------------------
引用 6 楼 afunx 的回复:
引用 5 楼 spiniper 的回复:
引用 4 楼 mytest114 的回复:

SAX我也试过,但是要是节点数过多超过232M的时候就内存泄露了,一时找不到原因,希望各位大侠能给点具体的意见,谢谢


这很可能不是SAX的问题,而是你自己实现的问题,换句话说,SAX是逐行读取的,但是你却把它们全部读取出来再处理的,再仔细分析你的代码。

+1


+10086

SAX --------------------编程问答--------------------
引用 8 楼 chenchenyangll 的回复:
引用 6 楼 afunx 的回复:

引用 5 楼 spiniper 的回复:
引用 4 楼 mytest114 的回复:

SAX我也试过,但是要是节点数过多超过232M的时候就内存泄露了,一时找不到原因,希望各位大侠能给点具体的意见,谢谢


这很可能不是SAX的问题,而是你自己实现的问题,换句话说,SAX是逐行读取的,但是你却把它们全部读取出来再处理的,再仔细分析你的代码。
……


sax本身肯定是没问题的,sax读取的内容,要边读边处理,边释放.简单一点说,你用sax一次读一个节点,记的内容一直放在一个数组里,不边读边释放处理,当然读多了也会溢出的. 仔细检查下代码. --------------------编程问答-------------------- 推荐一下vtd解析 --------------------编程问答-------------------- http://vtd-xml.sourceforge.net/
--------------------编程问答-------------------- 试了几个方案,基本上功能出来了,但是感觉还是不大稳定,解析1.5G的XML文件没问题,40G的还没试过,

目前采用的是SAX,每次解析一个Record节点,内存中最多记录一个Record节点(包含子节点)对象;但是感

觉好像不大稳定,不知道各位大侠有好的建议么,谢谢大家了

--------------------编程问答--------------------
引用 12 楼 mytest114 的回复:
试了几个方案,基本上功能出来了,但是感觉还是不大稳定,解析1.5G的XML文件没问题,40G的还没试过,

目前采用的是SAX,每次解析一个Record节点,内存中最多记录一个Record节点(包含子节点)对象;但是感

觉好像不大稳定,不知道各位大侠有好的建议么,谢谢大家了


“好像不大稳定”这个感觉 你具体描述下 --------------------编程问答-------------------- 对于大数据量解析,或者传输(我感觉到你这可能是个数据传输),最好的方式是不要用xml,因为xml的固有缺陷就是数据量太大,他传输的实体数据可能并不多,而xml的描述数据可能会是实体数据的几倍。
另外,不太稳定的原因,应该是你解析xml存在逻辑错误,这种错误可能很难找,但是不管解析框架的事,应该是自身程序的问题,这需要调试,可能你需要请求测试人员,帮你跟踪一下程序的运行过程,如果你的脑子无法做这种比较复杂的逻辑推演的话。 --------------------编程问答--------------------
引用 13 楼 chenchenyangll 的回复:
引用 12 楼 mytest114 的回复:

试了几个方案,基本上功能出来了,但是感觉还是不大稳定,解析1.5G的XML文件没问题,40G的还没试过,

目前采用的是SAX,每次解析一个Record节点,内存中最多记录一个Record节点(包含子节点)对象;但是感

觉好像不大稳定,不知道各位大侠有好的建议么,谢谢大家了


“好像不大稳定”这个感觉 你具体描述下


呵呵,就是在解析XML的过程中,通过工具看到程序占用的内存不稳定,有时候又没问题,个人感觉还是有些瑕疵,就是在endElement(SAX解析)执行完之后内存释放有点问题,希望对这个比较了解的朋友能给点意见,谢谢;呵呵,最好能有个简单的代码样例看一下 --------------------编程问答--------------------
引用 14 楼 spiniper 的回复:
对于大数据量解析,或者传输(我感觉到你这可能是个数据传输),最好的方式是不要用xml,因为xml的固有缺陷就是数据量太大,他传输的实体数据可能并不多,而xml的描述数据可能会是实体数据的几倍。
另外,不太稳定的原因,应该是你解析xml存在逻辑错误,这种错误可能很难找,但是不管解析框架的事,应该是自身程序的问题,这需要调试,可能你需要请求测试人员,帮你跟踪一下程序的运行过程,如果你的脑子无法做这种……


感谢spiniper的建议,呵呵,不过我这个已经不存在传输的问题,只是单纯的解析,但在解析的时候文件比较大,所以希望能得到一个比较好的方案,在性能和稳定性上有个好的保障! --------------------编程问答-------------------- java可以在代码中控制内存的释放吗?如果只是通过java自身的内存垃圾回收机制释放内存的话,我觉得你看到的程序占用内存不稳定是正常的,因为java虚拟机回收内存的操作不是实时的。不知道对不对,仅供参考。 --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 如果文件很大的话,建议用SAX吧,如果用dom4j的话,需要所有的数据读入内存,生成数,这样的话,很容易出现内存溢出 --------------------编程问答-------------------- 生成树。。。。 --------------------编程问答-------------------- 呵呵,最后采用的也是SAX解析,感觉也只能这样子了 --------------------编程问答-------------------- 即将使用 ,收益颇多 --------------------编程问答-------------------- sax或者pull都可以 --------------------编程问答-------------------- 学习中,这个我也不清楚~~ --------------------编程问答-------------------- SAXReader --------------------编程问答-------------------- 300M,真是BT,这么大的文件,不拆分,系统怎么设计的。

如果你的sax相关代码都没有问题,那么这300M的数据你是怎么处理的呢?放在内存里,等着读完了一起用?如果是这样,那你这个问题用java基本无解。

如果是取出一个信息就处理(例如持久化),然后释放,那就要慢慢查原因了。 --------------------编程问答-------------------- 使用sax解析,控制在特定的时候使用System.gc()方法,执行垃圾回收!我前段时间也是弄这个问题 --------------------编程问答-------------------- --------------------编程问答-------------------- 使用sax解析,控制在特定的时候使用System.gc()方法,执行垃圾回收!学习了。 --------------------编程问答-------------------- 内存不稳定不是问题,只要不是一直上涨就行,

解析后的东西放入一个集合,每 100 条时在 endElement 中保存到数据库然后清空集合,再继续解析,反正是不能全部分 record 都放在内存的集合里面。

清空时保留原来那个 List,仅仅是 list.clear 就行了,没必要重新 new ArrayList(100);
--------------------编程问答--------------------  LZ 你最后是怎么处理的? 以有分享下吗?
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,