【问题标题】:GLM object in R takes more RAM than the object size of the GLM objectR 中的 GLM 对象占用的 RAM 比 GLM 对象的对象大小更多
【发布时间】:2015-08-22 11:47:10
【问题描述】:

我正在尝试将多个 GLM 对象保存在一个列表中。一个 GLM 对象在大型数据集上进行训练,但是通过将 GLM 对象中所有不必要的数据设置为 NULL 来减小对象的大小。问题是我遇到了 RAM 问题,因为 R 保留的 RAM 比 GLM 对象的大小要多得多。有人知道为什么会出现这个问题以及我该如何解决这个问题?在此保存对象的背后会导致文件大于对象大小。

例子:

> glm_full <- glm(formula = formule , data = dataset, family = binomial(), model = F, y = F)
> glm_full$data <- glm_full$model <- glm_full$residuals <- glm_full$fitted.values <- glm_full$effects <- glm_full$qr$qr <- glm_full$linear.predictors <- glm_full$weights <- glm_full$prior.weights <- glm_full$y <- NULL
> rm(list= ls()[!(ls() %in% c('glm_full'))])
> object.size(glm_full)
172040 bytes
> gc()
           used  (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells   944802  50.5    3677981  196.5   3862545  206.3
Vcells 83600126 637.9  503881514 3844.4 629722059 4804.4
> rm(glm_full)
> gc()
          used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  944208 50.5    2942384  157.2   3862545  206.3
Vcells 4474439 34.2  403105211 3075.5 629722059 4804.4

在这里你可以看到 R 为 GLM 对象保留了 RAM,在环境中保存多个 GLM 对象会导致 RAM 不足的问题。

【问题讨论】:

    标签: r ram glm objectsize


    【解决方案1】:

    对此的粗略解释是glmglm 对象的深处(以及许多地方)隐藏了指向环境和环境中事物的指针。

    您需要能够使用您的glm 做什么?即使您已经消除了模型的很多“脂肪”,您的对象大小仍然会随着您的数据大小线性增长,并且当您通过存储多个 glm 对象来复合它时,遇到 RAM 限制是一个明显的担忧。

    这里有一个函数可以让你切掉几乎所有不必要的东西,最好的部分是glm 对象大小将保持不变,无论你的数据有多大。

    stripGlmLR = function(cm) {
      cm$y = c()
      cm$model = c()
    
      cm$residuals = c()
      cm$fitted.values = c()
      cm$effects = c()
      cm$qr$qr = c()  
      cm$linear.predictors = c()
      cm$weights = c()
      cm$prior.weights = c()
      cm$data = c()
    
    
      cm$family$variance = c()
      cm$family$dev.resids = c()
      cm$family$aic = c()
      cm$family$validmu = c()
      cm$family$simulate = c()
      attr(cm$terms,".Environment") = c()
      attr(cm$formula,".Environment") = c()
    
      cm
    }
    

    一些注意事项:

    您可以完全取消model$familypredict 函数仍将返回其默认值(因此,predict(model, newdata = data)) 将起作用)。但是,predict(model, newdata=data, type = 'response') 将失败。您可以通过反向链接函数传递链接值来恢复 response:在逻辑回归的情况下,这是 sigmoid 函数 sigmoid(x) = 1/(1 + exp(-x))。 (不确定type = 'terms'

    最重要的是,除了predict 之外,您可能想对glm 模型执行的任何其他操作都将在精简版本上失败(因此summary()anova()step() 是都是不行的)。因此,明智的做法是从glm 对象中提取所有这些信息,然后运行stripGlmLR 函数。

    信用:Nina Zumelglm 对象内存分配的精彩分析

    【讨论】:

    • 感谢您的帮助,完美解决了问题!
    猜你喜欢
    • 2018-05-23
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多