首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R数据帧的内存使用情况

R数据帧的内存使用情况
EN

Stack Overflow用户
提问于 2015-11-25 23:47:09
回答 1查看 592关注 0票数 0

我有一个数据框架,它是使用RMySQL对SQL server进行查询后得到的,然后对其应用dplyr。

在我对其使用subset()之后,得到的子集数据帧占用与原始数据帧相同的空间。

子集具有约10%的原始数据帧的行。我将数据框保存为CSV文件并再次加载,然后它的大小是我预期的10%。

代码语言:javascript
复制
# 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)

现在,内存使用量显示为:

代码语言:javascript
复制
                    Type      Size    Rows Columns
df            data.frame 455869312 5180320       2
dfss          data.frame 414427000      13       2

在做了像dfss$requests <- 1这样的事情之后,我仍然得到:

代码语言:javascript
复制
                    Type      Size    Rows Columns
df            data.frame 455869312 5180320       2
dfss          data.frame 414427000      13       2

如果我使用head(df,10000)截断表,然后重新执行整个操作,我会得到类似的行为,子集只比原始集小一点,尽管它只有几行:

代码语言:javascript
复制
                 Type     Size   Rows Columns
df         data.frame 20199008 229521       2
dfss       data.frame 18440576   9718       2

这里发生什么事情?

EN

回答 1

Stack Overflow用户

发布于 2015-11-26 00:06:23

你没有提供一个可重复使用的例子,但我确信你完全错了。R将通过指向相同内存地址的指针进行复制。表示修改数据的子集将需要原始数据大小的子集。

如下所示:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33920788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档