R,mclapply 的环境和删除变量

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().

也许你们中的一个人也观察到了类似的事情。

此致,

马里奥

Ste*_*ton 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))
  })
Run Code Online (Sandbox Code Playgroud)