2017-02-15 15 views
1

我正在使用R包並行的函數parSapply。 我對這個函數的調用是一樣的東西:R包並行:如何打印來自一個節點的輸出?

cl <- makeCluster(3, type="PSOCK",outfile="output.txt") 
m<-10 
parSapply(cl,as.list(1:m), FUN=function(mtmp){ 
comp<-0 
for (ii in 1:10){ 
    print(ii) 
    comp<-comp+rnorm(1) 
} 
return(comp) 
}) 

並行化功能打印一條消息遵循的過程。這對估計函數所需的時間非常有用。使用此代碼,每個節點的打印消息都存儲在一個txt文件(output.txt)中,但由於所有節點都在同一時間生成消息,因此會融化。因此,爲了讓打印的消息在我的txt文件中可讀,我希望僅遵循一個節點的過程。我在考慮對於{1,4,7,10}中的mtmp,迭代是在同一個節點上執行的。所以,我想加上一條:

if(mtmp%%3==1){print(ii)} 

但是,這些消息再次熔化,這表明在{1,4,7,10}同一節點上不執行MTMP電話。

因此,我的問題是:如何在我的txt文件中保存一個節點的所有打印消息,並且只保存這一個?另外,我想這個節點是處理大量調用我的並行函數的節點。

非常感謝您的幫助,

文森特

回答

2

每個過程的輸出轉接至一個單獨的文件:

library(parallel) 
cl <- makeCluster(3, type="PSOCK") 
#divert to different files: 
clusterEvalQ(cl, sink(paste0("E:/temp/output", Sys.getpid(), ".txt"))) 

m<-10 

parSapply(cl,as.list(1:m), FUN=function(mtmp){ 
    comp<-0 
    for (ii in 1:10){ 
    print(ii) 
    comp<-comp+rnorm(1) 
    } 
    return(comp) 
}) 

stopCluster(cl) 
+0

非常好,謝謝! –