作者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)