R,mclapply 的环境和移除变量

R, the environment of mclapply and removing variables

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

我做了类似的事情:

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

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

当我删除 opt.Models、rm(opt.Models) 时,我仍然 运行 陷入同样的​​问题。 mclapply 消耗的内存比可用内存多(顺便说一句:90GB)。 那么,mclapply fork 了哪个环境,或者 opt.Models 没有完全消失?我无法使用 ls().

看到它

也许你们中有人观察到类似的事情。

此致,

马里奥

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

您可能还想在第一个 mclapply 之前调用 gc 以使测试更容易:

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