R数据帧的内存使用情况

时间:2015-11-25 15:47:09

标签: r memory-management dataframe

我有一个数据框,是使用RMySQL查询SQL服务器并在之后应用dplyr。

在我使用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 $ requests&lt; - 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

这里发生了什么?

1 个答案:

答案 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)