锁定老帖子 主题:10万个字符串相加会发生什么??
精华帖 (0) :: 良好帖 (3) :: 新手帖 (7) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-29
最后修改:2010-01-29
最近在检查公司平台的一个BUG,BUG的具体症状是:平台用户上传了一个附件,提交时需要等待30-50分钟,有时根本传不上去。 解决BUG: 1、我先检查了平台的日志,发现相关业务没有发生异常,检查了整个WEB服务器的日志,发现有很多"TNS:connection close"。接着我就怀疑是由于平台的链接池被耗尽,于是我就重新配置链接池,定期回收超时链接。 2、代码上线后,用户反应该问题还是存在,但是现在可以提交了,不会出现提交不上去。但是现在还是很慢速度并没有上去。并且运维同事反一旦用户提交后,系统的CPU负载会达到一个很可怕的数量级。于是我把该业务模块的所有代码拿出来一个个剖析跟踪。结果真发现了问题,即使在本地,提交一个10万行左右的文件,也很慢。。。 慢慢一行代码段出现在了我的面前具体如下: while((fileLine = in.readLine()) != null) { line_num++; if(CTools.checkMobileValid(fileLine)!=0) { text_error = "error"; send_hash.put(String.valueOf(hash_num), line_num + "_" + "您输入的手机号码无效!"); hash_num++; } else { mobilenumber += fileLine + ","; } } String[] mobilenumber_arry = mobilenumber .split(",");
mobilenumber += fileLine + ",";
请注意代码中红色 字体部分,另外该循环大概有10万行。 看到上面的代码我很是郁闷....,这样的思路我是理解不了,也看不明白,贴一个字符串测试例子: http://blog.csdn.net/chuan122345/archive/2007/08/12/1739806.aspx
通过这个例子,我们可以学习到字符串链接,有时候真会死机的。。。如果传一个20万行的文件,我将毫不怀疑会直接把服务器给挂死。。。(当然,这也取决于服务器的运算力。。。)
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-30
楼主应该学习了解一下String的类型,这样的频繁拼接应该用StringBuffer
|
|
返回顶楼 | |
发表时间:2010-01-30
mengke 写道 楼主应该学习了解一下String的类型,这样的频繁拼接应该用StringBuffer 楼主的描述似乎表明这段代码并不是楼主自己写的,而是楼主接手维护的。这种状况让人同情…… 而且原本那段代码要表达的意图大概是这样: List<String> mobilenumber = new ArrayList<String>(); while((fileLine = in.readLine()) != null) { line_num++; if(CTools.checkMobileValid(fileLine)!=0) { text_error = "error"; send_hash.put(String.valueOf(hash_num), line_num + "_" + "您输入的手机号码无效!"); hash_num++; } else { mobilenumber.add(fileLine); } } String[] mobilenumber_arry = mobilenumber.toArray(new String[mobilenumber.size()]); 楼主显然也知道这点……只是提醒一下大家说别像顶楼代码那样乱搞而已,吧? |
|
返回顶楼 | |
发表时间:2010-01-30
最好是用StringBuilder,非线程安全的
|
|
返回顶楼 | |
发表时间:2010-01-30
同意楼上这位,用stringbuilder更好
|
|
返回顶楼 | |
发表时间:2010-01-30
最后修改:2010-01-30
是的,string类型的字符串相加会很慢,有次我读了一个文件,我因为死机了呢,
原来是拼串特别慢。不过我的数量级没有你那么大,最后结果还是出来了。 |
|
返回顶楼 | |
发表时间:2010-01-30
我也赞同用StringBuffer
|
|
返回顶楼 | |
发表时间:2010-01-30
Effective java中也有一个这样经典的案例。就是字符串相加。StringBuilder是JDK1.5出来的,用意是替换以前的StringBuffer 比StringBuffer操作效率更高
|
|
返回顶楼 | |
发表时间:2010-01-30
append太多了会溢出。
我的意思是 buffer append太多,在很久以前这件事在我面前发生了 |
|
返回顶楼 | |
发表时间:2010-01-30
RednaxelaFX 的回复才是正途!
为什么要拼接起来后再拆分呢?如果不担心OOM,不能直接放入一个List,后面直接使用吗? |
|
返回顶楼 | |