r - R工作空间和磁盘上相同对象的内存差异

原文 标签 r memory data.table

我找不到有关此的任何信息,并且不确定我可以搜索哪些其他关键字,所以如果这是重复的,我们深表歉意。

我的工作区中有一些 data.tables 列表,如下所示:

> lsos()   
                       Type     Size PrettySize Rows Columns
all_subsets            list 46673512    44.5 Mb    3      NA
glm_Macro.part_1       list 15817064    15.1 Mb    2      NA
glm_Macro.part_2       list 15817064    15.1 Mb    2      NA
glm_Macro.part_3       list 15289864    14.6 Mb    2      NA

然后我需要将列表中的最后三个项目保存到磁盘。我只是使用 save().rda扩展名,例如
save(glm_Macro.part_1, file = "glm_Macro.part_1.rda")

然而,从磁盘上看,三个文件的大小分别为。 270.7、268.8 和 262.6 MB .这大约是 18 倍。

这有什么已知的原因吗?

我唯一的预感是路data.table使用引用,意味着数据不会被复制,而只是从原始数据集中引用。见 here for an example of how that works .
因此,当我将数据保存到磁盘时,可能会强制复制所有 data.tables,在 R 工作区中,引用已经足够了。

终端、Rstudio 和 ESS (Emacs) 在工作区中都显示相同的大小,因此它与看起来的环境无关。

最佳答案

我不认为这与data.table有关,而是与base R有关。这会导致glm的保存文件在某些情况下,对象会很大/很大。

根据您的模型名称,我猜您正在安装 glm函数调用中的模型。由于 glm 的输出包含在函数环境中创建的公式,公式捕获环境,您保存的文件将包含该函数环境。

比较:

library(multilevelPSA)

test_in_env <- function(){
  bloat <- rnorm(10000000)

  clotting <- data.frame(
    u = c(5,10,15,20,30,40,60,80,100),
    lot1 = c(118,58,42,35,27,25,21,19,18),
    lot2 = c(69,35,26,21,18,16,13,12,12))
  glm(lot1 ~ log(u), data = clotting, family = Gamma)
}

test.glm <- test_in_env()
lsos()
# Type  Size PrettySize Rows Columns
# test.glm         glm 94936    92.7 Kb   30      NA
# test_in_env function 12008    11.7 Kb   NA      NA
# GCtorture    logical    48   48 bytes    1      NA


save(test.glm, file = "glm_env_local.Rda")
# 75 Mb file created

它捕获本地环境,包括保存文件中的膨胀向量。
在全局情况下,没有该功能:
bloat <- rnorm(10000000)

clotting <- data.frame(
  u = c(5,10,15,20,30,40,60,80,100),
  lot1 = c(118,58,42,35,27,25,21,19,18),
  lot2 = c(69,35,26,21,18,16,13,12,12))
test.glm <- glm(lot1 ~ log(u), data = clotting, family = Gamma)

lsos()
# bloat                numeric 80000040    76.3 Mb 1e+07      NA
# test.glm                 glm    94936    92.7 Kb 3e+01      NA
# test_in_env         function    12008    11.7 Kb    NA      NA
# clotting          data.frame     1280     1.2 Kb 9e+00       3
# local.env.formula    formula      880  880 bytes 3e+00      NA
# GCtorture            logical       48   48 bytes 1e+00      NA

save(test.glm, file = "glm_env_global.Rda")
## 5 Kb file

保存不会在保存中包含封闭环境,因此是由 lsos 反射(reflect)的大小. It is possible to remove glm 中的引用资料-输出,以及该对象中的其他膨胀。

可以找到与环境相关的问题 here .
以及封闭函数环境的解释见Hadley Wickham's description .

关于r - R工作空间和磁盘上相同对象的内存差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34820875/

相关文章:

.net - winforms 分析 - dotTrace 3.1 或 Ants 4.3

r - 如何将 fread() 与 "https"url 方案一起使用?

rbindlist 两个 data.tables,其中一个具有因子,另一个具有列的字符类型

r - 将列折叠/连接/聚合为每个组内的单个逗号分隔字符串

python - 我如何使用大的、内存饥渴的 numpy 数组?

r - 如何计数取决于2个条件

c++ - 访问其他程序使用的内存

r - 处理 data.table 中的闭包

R:在多页的网格布局中绘图

r - 在 R 中,根据元素名称(rbind 和指示变量)重新组织列表