同一对象的R工作区和磁盘上的内存差异

同一对象的R工作区和磁盘上的内存差异,r,memory,data.table,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 1581

我找不到关于这个的任何信息,也不确定我还能在谷歌上找到什么其他关键字,所以如果这是重复的话,我深表歉意

我的工作区中有一些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倍大

有没有已知的原因

我唯一的直觉是
数据的方式。table
使用引用,这意味着数据不会被复制,而只是从原始数据集中引用。看见 因此,当我将数据保存到磁盘时,可能会强制复制所有data.tables,在R工作区中引用已经足够了


Terminal、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
库(多级PSA)

在环境中测试什么是
lsos()
函数?为什么列是NA?为什么类型列是
列表
而不是
数据表
?2行和3行看起来非常小,所以要获得44Mb的大小,是否有大量的列?哦,它们是数据列表。表。请阅读并简化您的示例,即使其最小化。在本例中,取其中一个数据。表,保存它并比较大小,然后首先报告。@Matt Dowle-lsos()是multilevelPSA包中的一个函数,它比简单地使用ls()检查工作区中的变量更有用。好的,我将对此进行研究并与您联系。出于兴趣,您以前遇到过类似的情况吗?以前从未见过18倍的扩展。请提供单表示例。在这种情况下,您不需要使其完全可复制(一个小示例可能不会显示问题)。对于初学者来说,使用
str(DT)
提供列类型是可以的。
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