4

我无法理解 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 个内核)。第二次执行这段代码时,我的机器会吸入大量内存(超过可用内存 - 所以我停止执行)。这是预期的,因为再次为每个孩子分叉了完整的环境,而我的环境现在有大约 10GBmclapply的大变量。opt.Models因此需要 10*20=200GB。

当我删除 opt.Models, 时rm(opt.Models),我仍然遇到同样的问题。mclapply 消耗的内存多于可用内存(顺便说一句:90GB)。那么,mclapply fork 哪个环境,或者 opt.Models 没有完全消失?我看不到它使用ls().

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

最好的祝福,

马里奥

4

1 回答 1

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))
  })
于 2015-01-15T20:05:58.867 回答