R,mclapply和删除变量的环境

时间:2015-01-15 13:46:27

标签: r memory parallel-processing mclapply

我无法理解mclapply(或者其他东西)的行为。

我做的事情如下:

opt.Models = mclapply(1:100, mc.cores=20, function(i){
    res = loadResult(reg, id=i)    
    return(post.Process(res))
  })

loadResult从之前保存的BatchJob会话中加载一个结果。因此,res对象需要~170MB(大约所有100个对象的大小相同+/- 5MB)。 执行这段代码时,内存占用量与预期一致:170MB * 20 = ~3.5GB(我使用了20个内核)。 当我第二次执行这段代码时,我的机器会吸入大量内存(超过可用内存 - 所以我停止执行)。预期的是,因为mclapply再次为每个孩子分配完整的环境,我的环境现在拥有大约{10}的opt.Models变量。因此需要10 * 20 = 200GB。

当我删除opt.Models rm(opt.Models)时,我仍遇到同样的问题。 mclapply消耗的内存比可用内存多(顺便说一句:90GB)。 那么,mclapply fork哪个环境,或者不是opt.Models完全消失了?我无法使用ls()看到它。

也许你们其中一个人已经观察到类似的东西。

致以最诚挚的问候,

马里奥

1 个答案:

答案 0 :(得分:2)

您应该在删除变量后调用gc函数,以便垃圾收集器尽快释放与该对象关联的内存,而不是稍后。 rm函数仅删除对数据的引用,而实际对象可能会继续存在,直到垃圾收集器最终运行。

您可能还想在第一个gc之前致电mclapply以简化测试:

gc()
opt.Models = mclapply(1:100, mc.cores=20, function(i){
    res = loadResult(reg, id=i)    
    return(post.Process(res))
  })

# presumably do something with opt.Models...

rm(opt.Models)
gc()  # free up memory before forking

opt.Models = mclapply(1:100, mc.cores=20, function(i){
    res = loadResult(reg, id=i)    
    return(post.Process(res))
  })