我找不到有关此的任何信息,并且不确定我可以搜索哪些其他关键字,所以如果这是重复的,我们深表歉意。
我的工作区中有一些 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/