作者ntb (錩哥超口爱)
看板java
标题Re: [问题] 合成长字串时出现OutOfMemoryError
时间Tue Jun 28 14:25:36 2011
※ 引述《tkcn (小安)》之铭言:
: ※ 引述《ntb (錩哥超口爱)》之铭言:
: : 我的程式目的是想将文字档变成一行字串 (StringBuffer的物件)
: : 每个档案的大小约40 mb,
: : 因为第一行的标题不想串入StringBuffer的物件内,
: : 所以想跳掉第一行,
: : 但不知道为什麽少串这行,在执行时反而会发生错误。
: 预设的 heap size 是 64 mb,
: 你的一个档案就 40 mb,加上一些其他的资源,像是 buffer,还会再多些。
: 当回圈多做几次後,如果 gc 来不及回收就炸掉,应该也是蛮有可能的。
: : (若拿掉String str = input.readLine()就可以)
: 这个我看不出原因,能否多试几次看看。
: : while ((str = input.readLine()) != null){
: : sb = sb.append(str);
: 这行写成 sb.append(str) 就可以了,
: 因为 sb.append(...) 回传的仍然是 sb 的 refrence。
: 这是为了方便你连接多个 append 用的,
: ex: sb.append("Hello ").append("world!");
感谢t大的回应与指导,
不过多了String str = input.readLine()
记忆体会炸掉的问题 我还真的试不出来XD
不知道为了"不将文件第一行"也加到字串中,有没有其他更好的方式呢?
写这个程式的原因是想从文件中,截取特定范围的字串,
但因为有换行的问题,所以想说把他串成字串後,
再来用substring截取,比较不会有计算上的困扰,
但记忆体炸掉这个问题却无法克服。
之前是将整个文件档写到charArray中,再去截取,
现在想换StringBuffer方式来试试看,就遇到这些问题了,
不知道是否有更有效率的方式能达到我的目的呢?(截取特定范围的字串)
非常感谢您的帮忙与指导。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.109.55.234
1F:→ tkcn:我拿你的程式,依照你的描述去跑,没有遇到任何错误。 06/29 15:57
2F:→ ntb:冏..我是直接在dos下key..java指令执行...还是不行 06/29 17:06
3F:→ ntb:请问t大有用什麽IDE工具吗?谢谢 06/29 17:10
4F:→ tkcn:sun sdk 1.6.0_24 @ Linux,没用其他工具或下任何参数 06/29 18:44
5F:→ ntb:谢谢t大,我也去linux下试试好了 06/30 10:27
6F:→ dou0228:用 FileChannel.map 配合 MappedByteBuffer 吧 06/30 10:40
7F:→ dou0228:不过一样不要直接 mapping 全部到 memory 请自己切断 06/30 10:42
9F:推 undeadj:str建立释放太多次了,跳一行直接下input.readLine(); 06/30 21:48
10F:→ undeadj:把str,input,sb拉到外面去,用reference的方式 06/30 21:50
11F:→ ntb:感谢d大,不过要map前我还是要先串成一行,不然换行符号的问题 07/01 17:22
12F:→ ntb:还是会造成计算上的不便@@ 07/01 17:23
13F:→ ntb:也非常感谢u大的建议,我将str,input,sb拉到while外宣告,在 07/01 17:30
14F:→ ntb:winXP x86下执行,还是会爆@@ 07/01 17:32
15F:→ dou0228:没用阿 一个档案40mb 不改演算法就只能改 heap size 07/01 17:40
16F:→ dou0228:而且你只是要 sb.length? 那直接 file.length() 不就好了 07/01 17:45
17F:→ dou0228:改你的演算法吧,否则和 PHP 的 copy() 一样浪费记忆体 07/01 17:47
18F:→ dou0228:如果你档案不是40MB,而是 2G 那你还不用改演算法吗? XDDD 07/01 17:49
19F:→ ntb:谢谢d大的指教XD 其实我不只是要看length啦 我来换您的方法试试 07/01 18:27
※ 编辑: ntb 来自: 140.109.55.234 (07/01 18:27)