8

我正在使用 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 释放额外的内存?任何想法表示赞赏!

4

2 回答 2

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]
于 2012-12-03T23:41:26.377 回答
0

据我所知,问题不是 R 中的 gc() ,而是内存没有完全返回给操作系统的事实。

这个帖子没有提供答案,但它揭示了问题的本质。

于 2012-11-13T10:55:44.523 回答