如何从R工作区中删除未被垃圾回收删除的不可见对象?

时间:2012-11-02 13:00:29

标签: r memory-management

我正在使用mboost包中的blackboost函数来估计Windows 7 64位,8GB RAM机器上大约500mb数据集的模型。在执行期间,R几乎可以使用所有可用内存。计算完成后,即使在使用gc()调用垃圾收集或保存并将工作空间重新加载到新的R会话之后,仍然会将4.5gb以上的内容分配给R。使用.ls.objects(1358003)我发现所有可见对象的大小约为550mb。

gc()的输出告诉我大部分数据都在矢量单元格中,虽然我不确定这意味着什么:

            used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells   2856967  152.6    4418719  236.0   3933533  210.1
Vcells 526859527 4019.7  610311178 4656.4 558577920 4261.7

这就是我正在做的事情:

> memory.size()
[1] 1443.99
> model <- blackboost(formula, data = mydata[mydata$var == 1,c(dv,ivs)],tree_control=ctree_control(maxdepth = 4))

......加载了一堆软件包...

> memory.size()
[1] 4431.85
> print(object.size(model),units="Mb")
25.7 Mb
> memory.profile()
     NULL      symbol    pairlist     closure environment     promise    language 
        1       15895      826659       20395        4234       13694      248423 
  special     builtin        char     logical     integer      double     complex 
      174        1572     1197774       34286       84631       42071          28 
character         ...         any        list  expression    bytecode externalptr 
   228592           1           0       79877           1       51276        2182 
  weakref         raw          S4 
      413         417        4385 

mydata [mydata $ var == 1,c(dv,ivs)]有139593行和75列,主要是因子变量和一些逻辑或数字变量。 公式是类型的公式对象:“dv~var2 + var3 + .... + var73”。 dv 是变量名称字符串, ivs 是一个字符串向量,所有独立变量为var2 ... var74。

为什么将这么多内存分配给R?如何让R释放额外的内存?任何想法都赞赏!

2 个答案:

答案 0 :(得分:2)

我与其中一位软件包作者进行了交谈,他告诉我,与模型对象相关的大部分数据都保存在环境中,这就解释了为什么object.size不能反映blackboost引起的R的完整内存使用情况功能。他还告诉我,mboost软件包在速度和内存效率方面没有得到优化,但目标是灵活性,并且所有树都被保存,从而也保存了数据,这解释了生成的大量数据(我仍然发现尺寸显着..)。他建议使用gbm包(我无法复制我的结果)或者通过这样的方式序列化:

### first M_1 iterations
mod <- blackboost(...)[M_1]
f1 <- fitted(mod)
rm(mod)
### then M_2 additional iterations ...
mod <- blackboost(..., offset = f1)[M_2]

答案 1 :(得分:0)

从我可以收集的内容来看,R中的gc()不是问题,而是内存未完全返回操作系统的事实。

This thread没有提供答案,但它揭示了问题的本质。