如何在并行计算期间写出日志?如何调试并行计算?

时间:2013-10-30 21:08:45

标签: r debugging parallel-processing

我发现在并行计算期间是否有多个打印功能,只有最后一个打开将在控制台上显示。所以我设置了outfile选项,希望我能得到每个打印的结果。这是R代码:

cl <- makeCluster(3, type = "SOCK",outfile="log.txt") 

abc <<- 123

clusterExport(cl,"abc")

clusterApplyLB(cl, 1:6,  
         function(y){
                     print(paste("before:",abc));
                     abc<<-y;
                     print(paste("after:",abc));
         }
)
stopCluster(cl)

但我只得到三条记录:

starting worker for localhost:11888 
Type: EXEC 
Type: EXEC 
[1] "index: 3"
[1] "before: 123"
[1] "after: 2"
Type: EXEC 
[1] "index: 6"
[1] "before: 2"
[1] "after: 6"
Type: DONE 

1 个答案:

答案 0 :(得分:3)

看起来你只是从log.txt中获取一个worker的输出。我经常想知道是否会发生这种情况,因为当您指定outfile="log.txt"时,每个工作人员都会打开log.txt进行追加,然后调用sink。以下是outfile不是空字符串时由工作进程执行的代码:

## all the workers log to the same file.
outcon <- file(outfile, open = "a")
sink(outcon)
sink(outcon, type = "message")

这让我感到紧张,因为我不确定所有工作人员同时打开同一个文件会发生什么。它可能依赖于操作系统或文件系统,它可能解释了为什么您只从一个工作者那里获得输出。

出于这个原因,我倾向于使用outfile="",在这种情况下,不执行此代码,允许输出操作正常发生,而无需使用sink函数重定向它们。但是,在Windows上,如果您使用的是Rgui,则不会看到输出,因此请改用Rterm。

任务中的多个print语句应该没有问题,但是如果你没有设置outfile,你就不应该看到任何输出,因为所有输出都被重定向到/ dev / null情况下。