我编写了一些代码,使用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
工作都单独完成之前不会调用 .combine 是对的吗?如果是这样,为什么会这样,我该如何优化(除了使每个作业的输出更小)或改变这种行为?