【问题标题】:how to write out log during parallel computation? how to debug parallel computation?如何在并行计算期间写出日志?如何调试并行计算?
【发布时间】:2013-10-30 21:08:45
【问题描述】:

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

【问题讨论】:

    标签: r debugging parallel-processing


    【解决方案1】:

    看起来您只从 log.txt 中的一名工作人员那里获取输出。我经常想知道这是否会发生,因为当您指定 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。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多