如何在并行计算过程中写出日志?如何调试并行计算?

5

我发现在并行计算过程中,如果有多个打印函数,只有最后一个会显示在控制台上。因此,我设置了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个回答

6

看起来你只得到了log.txt中一个worker的输出。我经常想知道是否会发生这种情况,因为当你指定outfile="log.txt"时,每个worker将打开log.txt进行附加,然后调用sink。以下是worker进程在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。

我想补充一下,<outfile="log.txt"> 的效果非常好。当然,有时候会出现后续消息重叠的情况,因为所有节点都在同时访问它,但这仍然可以进行某种形式的监控,例如计算进度。 - kwadratens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接