为了账号安全,请及时绑定邮箱和手机立即绑定

这个循环我是要从数据库中提取20W条数据,然后先放到一个ArrayList里,但为什么越跑越慢呢

这个循环我是要从数据库中提取20W条数据,然后先放到一个ArrayList里,但为什么越跑越慢呢

牛魔王的故事 2023-03-12 17:13:41
List rows = jdbcTemplate.queryForList(SQL_select_Entry,new Object[] { 140000,0 });for(int m=0;m<rows.size();m++,counter++){infoBean = new InfoBean();infoBean.setEid(((Map) rows.get(m)).get("EID").toString());infoBean.setSid(((Map) rows.get(m)).get("SID").toString());infoBean.setContent(((Map) rows.get(m)).get("INTRO").toString());infoBean.setTitle(((Map) rows.get(m)).get("TITLE").toString());infoBean.setSecname(((Map) rows.get(m)).get("SECNAME").toString());infoBean.setPubtime(((Map) rows.get(m)).get("CREATE_TIME").toString());String xml = ((Map) rows.get(m)).get("XML_OBJECT").toString();xml_reader = null;try {xml_reader = new XMLReader(xml);} catch (IOException e) {System.out.println("解析XML时出错!!");}// 获取城市element = xml_reader.getElement(null, "city");infoBean.setZone(element.getAttributeValue("name"));infoBean.setAddress(xml_reader.getElementAtrribute("address"));infoBean.setPhone(xml_reader.getElementAtrribute("linktel"));infoBean.setLinkman(xml_reader.getElementAtrribute("linkman"));// 取 tagtag_view = "";element_list = xml_reader.getElementAtrributes("tag");for (int i = 0; i < element_list.size(); i++) {if (tag_view.length() > 0) {tag_view = tag_view + "/";}tag = StringUtil.returnValidStr(((Element) element_list.get(i)).getAttributeValue("name"));tag_view = tag_view+ "<a href=\"dosearch.shtml?q="+ tag+ "&view=2&type=l&encoding=gbk&area=tag\" target=\"_blank\" class=\"a01\" >"+ tag + "</a>";}infoBean.setTag(tag_view);infoBeanArrayList.add(m,infoBean);//this.createXML(infoBean,m,out);System.out.println("已经处理"+m+"条记录!");}我已经调整堆栈空间的大小,-Xms256m -Xmx768m,而且是在jbuilder2006下用纯java的环境测试的!
查看完整描述

3 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

慢的原因是你在对List的循环中使用了List的get函数.
典型的"Shlemiel喷涂算法",所以越跑越慢啊.
List里是一个链表,get方法会从头一个个地数,越到后面,数的时间就越长.所以会慢..
你应该修改方式,用下面的方法进行循环:
for(Iterator it = list.iterator(); it.hasNext() ;){
Map map = (Map)it.next();
// ...
}

查看完整回答
反对 回复 2023-03-15
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

infoBean = new InfoBean(); 

我看问题就出在这里,有20w条记录,就创建了20w个对象,却没有及时销毁!随着创建的对象越来越多,内存占用越来越大,当然会越来越慢了.不内存溢出算好的了

查看完整回答
反对 回复 2023-03-15
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

说的不一定对啊,你可以关注一下:
个人认为
List rows = jdbcTemplate.queryForList(SQL_select_Entry,new Object[] { 140000,0 }); 
infoBean = new InfoBean(); 
这两条语句都通过new方法建立了新的对象,其中一个还是临时对象,这要从内存中划分空间的,好像没看见你用delete清除掉这个对象,这样在循环了几万次之后,会产生很多的对象实例,这或许会使程序变得很慢。java虽然设有垃圾回收机制来回收不用的空间,但是没人知道这个机制在什么时候运行,如果你每次new的对象没有及时delete的话,是会影响程序性能的。而且JBuilder由于自身的原因,编译的速度本身也比较慢。
我不知道你的程序中是不是有办法避开使用对象,在如此大的循环中大量使用new方法,怕是会影响性能。

查看完整回答
反对 回复 2023-03-15
  • 3 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信