2013-10-30 63 views
1

我發現如果在並行計算過程中有多個打印功能,則只有最後一個打印功能會顯示在控制檯上。所以我設置了文件選項,並希望我能得到每個打印的結果。這裏是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 

回答

2

它看起來像你只能從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。

+0

投給'outfile =「」',它節省了我的一天 –