我无法理解 mclapply 的行为(或者可能是其他东西)。
我做类似的事情:
opt.Models = mclapply(1:100, mc.cores=20, function(i){
res = loadResult(reg, id=i)
return(post.Process(res))
})
loadResult
加载 一个 先前保存的 BatchJob session 的结果。所以,res
对象需要 ~170MB(大约所有 100 个对象的大小都相同 +/-5MB)。执行这段代码时,内存占用符合预期:170MB*20= ~3.5GB(我使用了 20 个内核)。
第二次执行这段代码时,我的机器会吸入大量内存(超过可用内存 - 所以我停止执行)。预期的结果,因为
mclapply
为每个 child fork 完整的环境,我的环境现在有很大的opt.Models
可变约 10GB。因此需要 10*20=200GB。当我删除 opt.Models 时,
rm(opt.Models)
,我仍然遇到同样的问题。 mclapply 消耗的内存多于可用内存(顺便说一句:90GB)。那么,mclapply fork 哪个环境,或者 opt.Models 没有完全消失?我用
ls()
看不到它.也许你们中的一个人观察到了类似的事情。
最好的祝福,
马里奥
最佳答案
您应该调用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))
})
关于R、mclapply 的环境及移除变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964849/