同一对象的R工作区和磁盘上的内存差异
我找不到关于这个的任何信息,也不确定我还能在谷歌上找到什么其他关键字,所以如果这是重复的话,我深表歉意 我的工作区中有一些data.tables列表,如下所示:同一对象的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
> 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