Re: [問題] 合成長字串時出現OutOfMemoryError

看板java作者 (錩哥超口愛)時間14年前 (2011/06/28 14:25), 編輯推噓1(1018)
留言19則, 4人參與, 最新討論串3/4 (看更多)
※ 引述《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

06/29 15:57, , 1F
我拿你的程式,依照你的描述去跑,沒有遇到任何錯誤。
06/29 15:57, 1F

06/29 17:06, , 2F
冏..我是直接在dos下key..java指令執行...還是不行
06/29 17:06, 2F

06/29 17:10, , 3F
請問t大有用什麼IDE工具嗎?謝謝
06/29 17:10, 3F

06/29 18:44, , 4F
sun sdk 1.6.0_24 @ Linux,沒用其他工具或下任何參數
06/29 18:44, 4F

06/30 10:27, , 5F
謝謝t大,我也去linux下試試好了
06/30 10:27, 5F

06/30 10:40, , 6F
用 FileChannel.map 配合 MappedByteBuffer 吧
06/30 10:40, 6F

06/30 10:42, , 7F
不過一樣不要直接 mapping 全部到 memory 請自己切斷
06/30 10:42, 7F

06/30 11:04, , 8F
MappedByteBuffer有檔案無法砍問題: http://goo.gl/NGBMV
06/30 11:04, 8F

06/30 21:48, , 9F
str建立釋放太多次了,跳一行直接下input.readLine();
06/30 21:48, 9F

06/30 21:50, , 10F
把str,input,sb拉到外面去,用reference的方式
06/30 21:50, 10F

07/01 17:22, , 11F
感謝d大,不過要map前我還是要先串成一行,不然換行符號的問題
07/01 17:22, 11F

07/01 17:23, , 12F
還是會造成計算上的不便@@
07/01 17:23, 12F

07/01 17:30, , 13F
也非常感謝u大的建議,我將str,input,sb拉到while外宣告,在
07/01 17:30, 13F

07/01 17:32, , 14F
winXP x86下執行,還是會爆@@
07/01 17:32, 14F

07/01 17:40, , 15F
沒用阿 一個檔案40mb 不改演算法就只能改 heap size
07/01 17:40, 15F

07/01 17:45, , 16F
而且你只是要 sb.length? 那直接 file.length() 不就好了
07/01 17:45, 16F

07/01 17:47, , 17F
改你的演算法吧,否則和 PHP 的 copy() 一樣浪費記憶體
07/01 17:47, 17F

07/01 17:49, , 18F
如果你檔案不是40MB,而是 2G 那你還不用改演算法嗎? XDDD
07/01 17:49, 18F

07/01 18:27, , 19F
謝謝d大的指教XD 其實我不只是要看length啦 我來換您的方法試試
07/01 18:27, 19F
※ 編輯: ntb 來自: 140.109.55.234 (07/01 18:27)
文章代碼(AID): #1E2NFZT- (java)
討論串 (同標題文章)
文章代碼(AID): #1E2NFZT- (java)