我无法理解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()
看到它。
也许你们其中一个人已经观察到类似的东西。
致以最诚挚的问候,
马里奥
答案 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))
})