[英]running multiple tasks at a time in r
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)
尝试这个:
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)
由于将整个矩阵导出到每个工作进程,然后仅使用一个子集,因此效率仍然有些低下。 但是我想这个原理是可以理解的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.