2017-01-18 24 views
1

我有月度報告文件,每個文件大約70MB。我寫了下面的功能將它們合併成一個單一的文件:寫入功能時內存不足(R)

fusionfil<-function(ruta){ 
    require(data.table) 
    fusionfrag<-paste0(ruta,grep("_filt",dir(ruta),value = TRUE)) 

    datalist<-list() 

    for(frag in fusionfrag){ 
    datalist[[frag]] <- fread(frag,colClasses="character") 
    } 

    datalist<-do.call(rbind,datalist) 

    fwrite(datalist,"fusion.csv") 
} 

但它會導致以下錯誤:

Warning messages: 
1: In rbindlist(l, use.names, fill, idcol) : 
    Reached total allocation of 8082Mb: see help(memory.size) 
2: In rbindlist(l, use.names, fill, idcol) : 
    Reached total allocation of 8082Mb: see help(memory.size) 

但是,如果我把最後fwrite出來,而不是分配的功能的輸出到一個變量,我可以寫沒有問題。我想了解這裏發生了什麼(如果有更高效的方法來實現我想要做的事情,那也會很棒)。

回答

0

嘗試fwrite調用之前清理一些內存

gc() 

來達到同樣的效果。

更新:我錯過了列表和組合表具有相同的名稱。

+0

如果我'rm' datalist那麼'fwrite'怎麼會知道要寫什麼?我嘗試了一些與'datalist < - do.call(rbind,datalist)'行類似的東西,據我的理解,它應該替換與合併對象不再相關的data.tables列表。 – zipzapboing

+0

好的,只要加上'gc()'就可以解決問題。謝謝! – zipzapboing

+0

我錯過了列表和組合表具有相同的名稱。 –