2015-01-15 92 views
2

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

当我删除opt.Models,rm(opt.Models),我仍遇到同样的问题。 mclapply比可用内存消耗更多的内存(btw:90GB)。 那么,哪个环境的mclapply叉,或不是opt.Models完全消失了?我无法看到它使用ls()

也许你们中的一个人观察到类似的东西。

最好的问候,

马里奥

+0

我不明白你为什么不内核的数量限制在一个比较合理的值。 –

+1

因为那不是我的问题。我只是想知道为什么这个内存没有被释放。减少内核只会导致效果收敛速度减慢。 – mariodeng

回答

1

你应该使之与对象相关的内存是由垃圾收集器释放宜早不宜迟取出变量后调用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)) 
    }) 
+0

史蒂夫,你做了我的一天。谢谢。 – mariodeng