2015-11-25 27 views
0

我有一個數據幀,該數據幀是使用RMySQL查詢到SQL服務器並在之後對其應用dplyr。R數據幀的內存使用情況

當我在其上使用subset()後,得到的子集數據幀將佔用與原始數據幀相同的空間。

該子集具有〜10%的原始數據幀的行數。我將數據框保存到一個CSV文件並重新加載,然後它的大小已達到我預期的10%。

# include dplyr and RMySQL, setup connection... etc. 

df = query("SELECT created_at FROM requests") 

requests$created_at %>% 
    as.POSIXlt %>% 
    cut.POSIXt(breaks="sec") %>% 
    table %>% as.data.frame -> df 

colnames(df) <- c('created_at', 'requests') 

dfss <- subset(df, requests > 3) 

現在,內存使用情況顯示爲:

    Type  Size Rows Columns 
df   data.frame 455869312 5180320  2 
dfss   data.frame 414427000  13  2 

而像DFSS $做任何事情之後請求< - 1,我仍然得到:

    Type  Size Rows Columns 
df   data.frame 455869312 5180320  2 
dfss   data.frame 414427000  13  2 

如果我截斷表通過使用head(df,10000)然後再做整個事情,我會得到類似的行爲,即使只有幾行,子集只比原始集合稍小一點:

    Type  Size Rows Columns 
df   data.frame 20199008 229521  2 
dfss  data.frame 18440576 9718  2 

這是怎麼回事?

+0

一些好的想法在這裏:http://stackoverflow.com/questions/1358003/tricks-to-manage-the-available-memory-in-an-r-session – Stedy

+0

實際上,最終的子集佔用(幾乎)零內存。第二個對象不是副本。只有在修改第一個對象時纔會進行復制。 – Andrie

+0

是的,看下面的答案 –

回答

1

你還沒有提供一個可重複的例子,但我相當確信你錯了。 R將通過指向同一內存地址的指針進行復制。代表修改數據的子集將需要原始數據大小的子集。

見下文:

library(pryr) 
mem_used() 

x <- matrix(1:10^6, 10^5) 
mem_used() 
y <- x 
mem_used() # copy via pointer, no new memory allocation 

y2 <- x[sample(1:nrow(x), 10^4,replace=F),] 
mem_used() # only requires a fraction of the memory of x 

y3 <- subset(x, sample(c(T,F), nrow(x), T, prob= c(.1,.9))) 
mem_used() # only requires a fraction of the memory of x 

object_size(x) 
object_size(y) 
object_size(y2) 
object_size(y3) 
+0

我會更具體,然後(請再次查看問題) –

+1

@RodrigoStv你的問題不是[reproducible](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-可重現的例子),我沒有看到你的問題有任何新的見解。提出更好的問題並獲得更具體的答案。 –

+0

不知道pryr,有趣! – Stedy