猿问

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

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"));
// 取 tag

tag_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的环境测试的!

牛魔王的故事
浏览 176回答 3
3回答

HUWWW

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

饮歌长啸

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

米琪卡哇伊

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

相关分类

Java
我要回答