【问题标题】:Saving a single object within a function in R: RData file size is very large在 R 中的函数内保存单个对象:RData 文件大小非常大
【发布时间】:2016-03-11 23:21:25
【问题描述】:

我正在尝试在 R 中保存修剪过的 GLM 对象(即,将所有“非必要”特征设置为 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, ...)

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

所以我理解这是一个环境问题,但我很难准确地确定它是如何发生的以及为什么会发生。生成的文件大小似乎变化很大。我尝试使用 saveRDS,同样我尝试通过

我对 R 环境的理解显然不是很好,如果有人能提出解决这个问题的方法,我将不胜感激。谢谢。

【问题讨论】:

  • 您能否充实您的示例,包括虚假数据,以便您的问题可重现?
  • 是的,您能否在函数内给出object.size 的输出?
  • 请参阅此处提出的解决方案(在 cmets 中进行代码校正)以获取绘图。它也应该适用于这种情况。 stackoverflow.com/questions/32192298/…

标签: r save environment glm rdata


【解决方案1】:

公式附加了环境。如果是全局环境或者包环境,是不保存的,如果不是可重构的,就保存了。

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()

这给出了 144 个字节的 formula3.Rdata

【讨论】:

    【解决方案2】:

    当您将调用中的参数命名为save 时,您是否发现您遇到了同样的问题?

    我用过:

    subFn <- function(y, x){
                 glmObject <- glm(y ~ x, family = "binomial")
                 save(list = "glmObject", file = "FileName.RData")
    }
    
    mainFn <- function(y, x){ 
             subFn(y, x)
    }
    
    mainFn(y = rbinom(n = 10, size = 1, prob = 1 / 2), x = 1:10)
    

    我看到文件“FileName.RData”是在我的工作目录中创建的。它的大小为 6.6 kb。

    然后我使用:

    load("FileName.RData")
    

    将内容glmObject 加载到我的全局环境中。

    【讨论】:

      猜你喜欢
      • 2022-11-29
      • 2014-06-06
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      相关资源
      最近更新 更多