看板 java 關於我們 聯絡資訊
※ 引述《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
tkcn:我拿你的程式,依照你的描述去跑,沒有遇到任何錯誤。 06/29 15:57
ntb:冏..我是直接在dos下key..java指令執行...還是不行 06/29 17:06
ntb:請問t大有用什麼IDE工具嗎?謝謝 06/29 17:10
tkcn:sun sdk 1.6.0_24 @ Linux,沒用其他工具或下任何參數 06/29 18:44
ntb:謝謝t大,我也去linux下試試好了 06/30 10:27
dou0228:用 FileChannel.map 配合 MappedByteBuffer 吧 06/30 10:40
dou0228:不過一樣不要直接 mapping 全部到 memory 請自己切斷 06/30 10:42
dou0228:MappedByteBuffer有檔案無法砍問題: http://goo.gl/NGBMV 06/30 11:04
undeadj:str建立釋放太多次了,跳一行直接下input.readLine(); 06/30 21:48
undeadj:把str,input,sb拉到外面去,用reference的方式 06/30 21:50
ntb:感謝d大,不過要map前我還是要先串成一行,不然換行符號的問題 07/01 17:22
ntb:還是會造成計算上的不便@@ 07/01 17:23
ntb:也非常感謝u大的建議,我將str,input,sb拉到while外宣告,在 07/01 17:30
ntb:winXP x86下執行,還是會爆@@ 07/01 17:32
dou0228:沒用阿 一個檔案40mb 不改演算法就只能改 heap size 07/01 17:40
dou0228:而且你只是要 sb.length? 那直接 file.length() 不就好了 07/01 17:45
dou0228:改你的演算法吧,否則和 PHP 的 copy() 一樣浪費記憶體 07/01 17:47
dou0228:如果你檔案不是40MB,而是 2G 那你還不用改演算法嗎? XDDD 07/01 17:49
ntb:謝謝d大的指教XD 其實我不只是要看length啦 我來換您的方法試試 07/01 18:27
※ 編輯: ntb 來自: 140.109.55.234 (07/01 18:27)