5 memory parallel-processing r mclapply
我无法理解 mclapply (或者其他东西)的行为。
我做类似的事情:
opt.Models = mclapply(1:100, mc.cores=20, function(i){
res = loadResult(reg, id=i)
return(post.Process(res))
})
Run Code Online (Sandbox Code Playgroud)
loadResult加载先前保存的 BatchJob 会话的一个结果。因此,该res对象需要约 170MB(大约所有 100 个对象的大小都相同 +/-5MB)。执行这段代码时,内存占用量符合预期:170MB*20= ~3.5GB(我使用了20个核心)。当第二次执行这段代码时,我的机器吸入大量内存(超过可用内存 - 所以我停止执行)。这是预期的,因为再次为每个孩子分叉完整的环境,我的环境现在有大约 10GBmclapply的大变量。opt.Models因此需要 10*20=200GB。
当我删除 opt.Models, 时rm(opt.Models),我仍然遇到同样的问题。mclapply 消耗的内存超过可用内存(顺便说一句:90GB)。那么,mclapply 分叉了哪个环境,或者 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))
})
Run Code Online (Sandbox Code Playgroud)