我有一个数据框,是使用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
这里发生了什么?
答案 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)