2016-01-13 50 views
4

我有幾個巨大的數據表dt_1, dt_2, ..., dt_N相同的列。我想將它們綁在一起成爲一個單獨的datatable。如果我使用如何在不增加內存消耗的情況下綁定data.table?

dt <- rbind(dt_1, dt_2, ..., dt_N) 

dt <- rbindlist(list(dt_1, dt_2, ..., dt_N)) 

則存儲器使用率是大約兩倍所需dt_1,dt_2,...,dt_N量。有沒有辦法將它們綁定在一起,而不會顯着增加內存消耗?請注意,一旦它們組合在一起,我不需要dt_1, dt_2, ..., dt_N

+0

在R裝入之前,我可能關閉,但是你是否考慮過在你結合'dt'之後從你的環境中去掉'dt_1,dt_2'等等? – Heroka

+0

是的,我之後刪除了它們。但在綁定期間,內存仍然翻倍。 – imsc

+0

看到我的答案可能有點慢,但可能更有效的內存使用與拆除,而綁定。 – Heroka

回答

2

我猜<<-get可以幫助你。

UPDATE<<-沒有必要。

df1 <- data.frame(x1=1:4, x2=letters[1:4], stringsAsFactors=FALSE) 
df2 <- df1 
df3 <- df1 

dt.lst <- c("df2", "df3") 

for (i in dt.lst) { 
    df1 <- rbind(df1, get(i)) 
    rm(list=i) 
} 

df1 
3

您可以刪除你的數據表你已經綁定在他們之後,雙內存使用由包括副本的新數據幀引起的。

插圖:

#create some data 
nobs=10000 
d1 <- d2 <- d3 <- data.table(a=rnorm(nobs),b=rnorm(nobs)) 
dt <- rbindlist(list(d1,d2,d3)) 

那麼我們可以看看每個對象的內存使用source

sort(sapply(ls(),function(x){object.size(get(x))})) 
    nobs  d1  d2  d3  dt 
    48 161232 161232 161232 481232 

如果內存使用率如此之大的單獨數據表和合並數據表不能共存,我們可以(令人震驚的,但恕我直言,這種情況下,由於有少量的數據表,並且它易於閱讀和理解)保證循環和get來創建我們的組合數據表並同時刪除單個數據表:

mydts <- c("d1","d2","d3") #vector of datatable names 

dt<- data.table() #empty datatable to bind objects to 

for(d in mydts){ 
    dt <- rbind(dt, get(d)) 
    rm(list=d) 
    gc() #garbage collection 
} 
+0

也許值得澄清的是:'d1 < - d2 < - d3'只佔用內存中第一個空間的空間。 '< - DT'產生一個指向DT的新指針,而< - copy(DT)'將產生一個新副本(使空間消耗增加一倍)。試試'地址(d1)'和'地址(d2)',它們應該有相同的值。 'tables()'命令對於檢查內存也很方便。另外,不知道你爲什麼會'得到'這裏...'L < - list(d1,d2,d3)'可以迭代,也只是指針,我認爲:'sapply(L,地址)' – Frank

+0

@Frank不知道;謝謝。 – Heroka

5

其他方法,使用臨時文件,以「綁定」:

nobs=10000 
d1 <- d2 <- d3 <- data.table(a=rnorm(nobs),b=rnorm(nobs)) 
ll<-c('d1','d2','d3') 
tmp<-tempfile() 

# Write all, writing header only for the first one 
for(i in seq_along(ll)) { 
    write.table(get(ll[i]),tmp,append=(i!=1),row.names=FALSE,col.names=(i==1)) 
} 

# 'Cleanup' the original objects from memory (should be done by the gc if needed when loading the file 
rm(list=ll) 

# Read the file in the new object 
dt<-fread(tmp) 

# Remove the file 
unlink(tmp) 

顯然比rbind方法比較慢,但如果你有內存爭,這不會比要求慢系統換出內存頁面。

當然,如果您的一部開拓創新的對象從文件在第一次加載,喜歡串聯文件與其他工具大多數旨在對文件進行操作(貓時,awk等)