亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這個循環我是要從數據庫中提取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+"條記錄!");}我已經調整堆??臻g的大小,-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 關注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號