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))
})
我无法理解 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))
})