我有一个数据框架,它是使用RMySQL对SQL server进行查询后得到的,然后对其应用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 <- 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这里发生什么事情?
发布于 2015-11-26 00:06:23
你没有提供一个可重复使用的例子,但我确信你完全错了。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)https://stackoverflow.com/questions/33920788
复制相似问题