在R中使用多核和doMC时,如何标记用于记录的子进程

时间:2011-03-29 12:35:12

标签: r logging multicore domc

我已经开始使用R的doMC包作为并行化plyr例程的并行后端。

并行化本身似乎工作正常(虽然我还没有正确地对加速进行基准测试),我的问题是日志记录现在是异步的,来自不同核心的消息混合在一起。我可以为每个核心创建不同的日志文件,但我认为我更简洁的解决方案是为每个核心添加一个不同的标签。我目前正在使用log4r包来满足我的日志需求。

我记得在使用MPI时,每个处理器都有一个排名,这是一种区分每个进程的方法,所以有没有办法用doMC执行此操作?我确实有提取PID的想法,但这似乎很麻烦,每次迭代都会改变。

我对这些想法很开心,所以欢迎任何建议。

编辑(2011-04-08):根据一个答案的建议,我仍然有正确识别我当前所在的子进程的问题,因为我要么需要单独的闭包每个log()调用,以便它写入正确的文件,或者我将有一个log()函数,但在其中有一些逻辑确定要附加到哪个日志文件。在任何一种情况下,我仍然需要一些标记当前子进程的方法,但我不知道如何做到这一点。

MPI库中是否有等效的mpi_rank()函数?

1 个答案:

答案 0 :(得分:4)

我认为将多个进程写入同一个文件是灾难的一个方法(它只是一个日志,所以也许“灾难”有点强大。)

我经常将工作与染色体并行化。这是我要做的一个例子(我主要使用foreach / doMC):

foreach(chr=chromosomes, ...) %dopar% {
  cat("+++", chr, "+++\n")
  ## ... some undoubtedly amazing code would then follow ...
}

获得相互踩踏的输出并不罕见...... 喜欢(不完全是)这个:

+++chr1+++
+++chr2+++
++++chr3++chr4+++

......你明白了......

如果我在你的位置,我想我会拆分每个进程的日志,并将它们各自的文件名设置为对于该进程循环中发生的事情是唯一的(如上面的chr} 。如果你必须......后来整理它们。 map / reduce你的日志文件: - )