当前位置:  开发笔记 > 编程语言 > 正文

在R中的函数中保存单个对象:RData文件的大小非常大

如何解决《在R中的函数中保存单个对象:RData文件的大小非常大》经验,为你挑选了1个好方法。

我正在尝试将精简的GLM对象保存在R中(即,将所有“非必需”特征都设置为NULL,例如,残差,prior.weights,qr $ qr)。

例如,查看我需要使用的最小对象:

print(object.size(glmObject))
168992 bytes
save(glmObject, "FileName.RData")

在全局环境中分配此对象并保存将导致大约6KB的RData文件。

但是,我实际上需要在函数内创建并保存glm对象,而函数本身就是函数内的对象。因此,代码如下所示:

subFn <- function(DT, otherArg, ...){
                 glmObject <- glm(...)
                 save(glmObject,"FileName.RData")
}

mainFn <- function(DT, ...){ 
             subFn(DT, otherArg, ...)
}

mainFn(DT, ...)

尽管对象本身具有相同的大小,但是这会导致大约20 MB的RData文件大得多。

因此,我知道这是一个环境问题,但我一直在努力确切查明它的发生方式和原因。生成的文件大小似乎相差很大。我试过使用saveRDS,同样,我试过通过<<-分配glmObject使其成为全局对象,但似乎无济于事。

我对R中的环境的理解显然不是很好,并且如果有人可以提出解决办法,我将不胜感激。谢谢。



1> user2554330..:

公式具有附加的环境。如果是全局环境或程序包环境,则不会保存它,但是如果不是可以重构的环境,则会保存它。

glm 结果通常包含公式,因此它们可以包含该公式附带的环境。

您无需glm证明这一点。尝试一下:

formula1 <- y ~ x
save(formula1, file = "formula1.Rdata")

f <- function() {
   z <- rnorm(1000000)
   formula2 <- y ~ x
   save(formula2, file = "formula2.Rdata")
}
f()

当我运行上述代码时,formula1.Rdata最终以114字节formula2.Rdata结尾,而最终为7.7 MB。这是因为后者捕获了创建它的环境,并且包含大向量z

为避免这种情况,请在保存公式之前清理创建公式的环境。不要删除该公式所引用的内容(因为glm可能需要这些内容),但是请删除不相关的内容(例如z在我的示例中)。看到:

g <- function() {
   z <- rnorm(1000000)
   formula3 <- y ~ x
   rm(z)
   save(formula3, file = "formula3.Rdata")
}
g()

这提供formula3.Rdata了144个字节。

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有