2014-07-18 110 views
0
rm(list=ls()) 

mat<-data.frame(matrix(NA,32,11)) 

mat[c(1,11,21),]<-mtcars[c(1,11,21),] 

tasks <- list(

    job1 = function(){repeat{na<-which(is.na(mat1[,1]));mat1[na,]=mat1[na-1,];if(all(is.na(mat1[,1])==F)==T)break}mat1}, 

job2 = function(){repeat{na<-which(is.na(mat2[,1]));mat2[na,]=mat2[na-1,];if(all(is.na(mat2[,1])==F)==T)break}mat2}, 

    job3 = function()repeat{na<-which(is.na(mat3[,1]));mat3[na,]=mat3[na-1,];if(all(is.na(mat3[,1])==F)==T)break}mat3}, 

    # To check that the computations are indeed running in parallel. 

    job4 = function() for (i in 1:5) { cat("4"); Sys.sleep(1) }, 

    job5 = function() for (i in 1:5) { cat("5"); Sys.sleep(1) }, 

    job6 = function() for (i in 1:5) { cat("6"); Sys.sleep(1) } 

) 

mat<-data.frame(matrix(NA,32,11)) 

mat[c(1,11,16),]<-mtcars[c(1,11,21),] 

mat1<-mat[1:10,] 

mat2<-mat[11:15,] 

mat3<-mat[16:32,] 

cl <- makeCluster(length(tasks)) 

clusterExport(cl, list("mat1","mat2","mat3"))  # make sure mtcars is loaded 

out <- clusterApply(cl, tasks, function(f) f()) 

stopCluster(cl) 
+0

可否請您提供適合上述任務的語法。 – 789372u

回答

0

試試這個:

cl <- makeCluster(length(tasks)) 
clusterExport(cl, "mat") 
out <- clusterApply(cl, tasks,function(f) f()) 

你需要做的對象提供給工作進程。這由clusterExport完成。

此外,請注意您的功能有點奇怪。在每個工作進程中完成相同的任務,這可能不是你打算做的。請注意,簡單地寫mat[1:10]只是打印相應的輸出,沒有別的。嘗試以下

job1 = function() { 
    mat <- mat[1:10, ];    # note the difference here 
    repeat{ 
    na<-is.na(mat[,1]); 
    mat[na,] <-mtcars[na,]; 
    if(all(is.na(mat[,1]))==F) break} 
    } 

對其他工作做類似的調整。然後調用

cl <- makeCluster(length(tasks)) 
clusterExport(cl, list("mat", "mtcars"))  # make sure mtcars is loaded 
out <- clusterApply(cl, tasks, function(f) f()) 
stopCluster(cl) 

這是仍有小幅低效率的,因爲你是整個矩陣輸出到每個工作進程,然後只使用一個子集。但我想這個原理是可以理解的。

+0

如果我運行上面的行,我得到6個空列表。 – 789372u

+0

從第一份工作中,我想知道在哪裏(在哪個記錄中),我在mat [1:10,]中有NA值,我想用另一個數據集替換那些記錄集相同的記錄。這裏兩個數據集具有相同的維度。 – 789372u

+0

請給我你的電子郵件ID我會給你我的代碼... – 789372u