R、mclapply 的环境及移除变量

标签 r memory parallel-processing mclapply

我无法理解 mclapply 的行为(或者可能是其他东西)。

我做类似的事情:

opt.Models = mclapply(1:100, mc.cores=20, function(i){
    res = loadResult(reg, id=i)    
    return(post.Process(res))
  })
loadResult加载 一个 先前保存的 BatchJob session 的结果。所以,res对象需要 ~170MB(大约所有 100 个对象的大小都相同 +/-5MB)。
执行这段代码时,内存占用符合预期:170MB*20= ~3.5GB(我使用了 20 个内核)。
第二次执行这段代码时,我的机器会吸入大量内存(超过可用内存 - 所以我停止执行)。预期的结果,因为 mclapply为每个 child fork 完整的环境,我的环境现在有很大的opt.Models可变约 10GB。因此需要 10*20=200GB。

当我删除 opt.Models 时,rm(opt.Models) ,我仍然遇到同样的问题。 mclapply 消耗的内存多于可用内存(顺便说一句:90GB)。
那么,mclapply fork 哪个环境,或者 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))
  })

关于R、mclapply 的环境及移除变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964849/

相关文章:

PHP - 允许的内存大小 134217728 字节已耗尽

r - geom_line - 同一行中的不同颜色

r - R中的动态过滤器

r - 在 gvisMotionChart 中绘制离去图

C - 将 float 存储到 char 数组并反转

clojure - 在搜索不断增长的解决方案空间时,应使用哪种 clojure 并行技术?

r - 如何在同一列内制作箱线图来表示土柱

c# - 银光内存使用

multithreading - 如何并行排序?

c# - 在并行循环之间保留 ThreadLocal 是好还是坏?