java处理比较大的xml文件

查看:189
本文介绍了java处理比较大的xml文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

如题,我用java需要处理一个300多M的xml文件。这个文件的核心结构如下:

然后现在我需要做的就是找到相当<sha1>内容的两个revision标签(如示例中的id为111和119的两个revision),然后将其中间的(包括最后一个119)revision全部删除.(按例子xml来说,最后就只剩一个id为111的revision)
下面是我用java写的核心算法:

其中sha跟revision都是arraylist的数组,sha存的是所有sha1标签的内容,revision存的是所有revision的内容。因为是一一对应的,所以我直接用的一个三层的循环来实现(前两层是寻找有相同sha1内容的,第三个循环则是删除这两个标签的之间的revision标签)。。

这个算法在处理一部分的测试xml时是没问题的,可是一旦用于测试300多M的那个源文件时会出现这样的错误:

我查了一些网上的说法,也调整了虚拟机的最大内存,但是依然会出现这样的错误。应该是我算法本身复杂度就比较高吧,但是我也没想到其他比较合适的处理思路了。求各位大神指教下orz

解决方案

你的算法优化的空间很大,看到你的代码,估计你是把xml文件都装进内存,然后进行循环来删除的。这样当你的电脑没有空余的300M+内存分配给java的heap区域,就会OOM。

建议优化方案:

  1. 使用sax方式解析xml文件,参考链接:http://www.mkyong.com/java/how-to-read-u...

  2. 使用set来保存sha1值,读取一个revision标签,就判断一下sha1值在不在set中:

    2.1 如果在,忽略
    2.2 如果不在,将该revision加入到你的revision数组,将sha1值加入到set中
    

直到遍历结束,revision数组中所有元素的sha1值都是不一样的了

这篇关于java处理比较大的xml文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆