Cla*_*nJY 6 parallel-processing foreach r
我编写了一些代码,使用foreach哪些进程并组合了大量的CSV文件.我在32核机器上运行它,使用%dopar%和注册32个核心doMC.我已经设置.inorder=FALSE,.multicombine=TRUE,verbose=TRUE,和有一个自定义组合函数.
我注意到如果我在一个足够大的文件集上运行它,看起来R会在第一次调用.combine之前尝试处理每个文件.我的证据是,在监测我的服务器HTOP,我最初看到的所有核心刷爆,然后对剩余作业,同时它在〜100批次的联合收割机只使用一个或两个核心(.maxcombine的默认值),如详细的控制台输出中所示.真正有用的是我给foreach的工作越多,看到"First call to combine"所需的时间就越长!
这对我来说似乎是违反直觉的; 我天真地期望foreach处理.maxcombine文件,合并它们,然后继续下一批,将它们与最后一次调用的输出结合起来.combine.我认为,对于.combine它的大多数用途都无关紧要,因为输出的大小与输入大小的总和大致相同; 但是我的组合功能减小了一些尺寸.我的工作足够大,以至于我不可能同时在RAM中保存所有4200多个单独的foreach作业输出,所以我依靠我的节省空间.combine和单独的批处理来看我.
我是对的.在我的所有foreach工作单独完成之前,组合不会被调用吗?如果是这样,为什么会这样,我如何优化(除了使每个作业的输出更小)或改变这种行为?
简短的回答是使用doMPI或doRedis作为并行后端.他们按照您的期望工作更多.
的doMC,doSNOW和doParallel后端是围绕功能,如相对简单的包装mclapply和clusterApplyLB,不叫,直到所有的结果都被计算,组合函数,你所观察到.的doMPI,doRedis和(现已解散)doSMP后端更复杂,并根据需要从迭代器获取输入,并按照您的假设即时调用组合函数.在我看来,这些后端有许多优点,如果你有适当的迭代器和组合函数,你可以处理任意数量的任务.让我感到惊讶的是,很多人与更简单的后端相处得很好,但是如果你有很多任务,那些花哨的任务是必不可少的,让你可以做一些相当困难的事情parallel.
我一直在考虑编写一个基于parallel软件包的更复杂的后端,它可以像我的doMPI软件包一样快速处理结果,但据我所知还没有任何要求它.事实上,你已经看到过这个问题了.
更新
在doSNOW后端现在支持即时结果处理.不幸的是,这不能用,doParallel因为parallel包不会导出必要的功能.
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |