[問題] 迴圈中相同名稱都覆蓋了還是記憶體不足

作者: greatjus (jus)   2016-08-04 12:38:01
使用經驗:2年,還OK
[問題]
我在使用R將資料存成不同檔案
首先是我有一筆大資料 A 我已經預先把 A 切割成 a1,a2,a3...,a140
再來是我寫迴圈,讓資料自動讀入、寫出,但是碰到問題是迴圈j
在一開始j=1到5時,都跑得很快,但是等j比較大之後就跑很慢
我有打開工作管理員看,比較發現每次回圈
都會使得R在"記憶體"的部分佔更大的比例,
後面甚至會佔到70%電腦記憶體以上。
我的疑問是,我回圈內所有的名稱,都是相同的名稱,應該下一次迴圈
都會覆蓋掉前一次迴圈物件才對,
不應該每跑一次迴圈,佔更多的記憶體阿?
[MY CODE]
library(data.table)
for(j in 0:34)
{
code@#$
rm(list=ls(all=TRUE))
}
裡面的 code@#$=
讀取 連續的4筆資資料
b1=a(j*4+1)
b2=a(j*4+2)
b3=a(j*3+3)
b4=a(j*4+4) #相當於j=0時讀取 a1,a2,a3,a4
B=rbind(b1,b2,b3,b4)
寫成B之後我有再刪減掉一些不需要的欄或列,以及加入一些新的變項
加入的變數我舉個例子,因為我怕記憶體會不足跟這個有關
Disease =cbind(Disease1 ,Disease2 ,...,Disease29)
Medicine=cbind(Medicine1,Medicine2,...,Medicine23)
最後是把加入的變數跟刪減後小很多的B合併再一起存成一個text檔
Final=cbind(B,Disease,Medicine)
write.table(Final,file = paste0('C:/users/data',j+1,'.txt'))
#相當於每個迴圈對應存成1個data
#data1到data34
想請問有碰過類似問題的人怎麼解決呢?
我也有google過R memory,很多都是在討論rm()和gc()
但是我看不太懂gc()......
想請有經驗的人幫幫我
不論你是誰,真的非常謝謝你的分享
作者: celestialgod (天)   2016-08-04 18:17:00
R的物件回收沒你想像中聰明雖然覆蓋掉同名物件,可是你在做binding他會先做複製的動作盡量不要在for裡面做bind,建議都用sapply+do.call有完整可以跑的範例 在寫給你看
作者: Wush978 (拒看低質媒體)   2016-08-05 22:04:00
rbind的問題吧
作者: clickhere (It's time to go home.)   2016-08-05 22:23:00
assign才會複製.biding不會.沒必要在loop裡做rm or gc.

Links booklink

Contact Us: admin [ a t ] ucptt.com