现在我有一个很大的矩阵来构建。这非常耗时。所以我想要并行完成。例如,矩阵是10 ^ 7 x 16,对于每列,我定义了一个矢量函数来计算值。像这里一样,我应该有16个功能。然后,我想将作业分配到16个核心以并行计算每个列,最后给我这个大矩阵。我怎么能在R?谢谢!
现在我尝试了serval包,例如parallel,foreach,doParallel。它不适用于某些错误。
这是我试过的一个简单例子
library(parallel)
N1 = 100
rka = rep(1, N1)
rkb = rep(2, N1)
rkab = rep(3,N1)
rna = rep(4,N1)
rnb = rep(5,N1)
rnab = rep(6,N1)
E1 = cbind(rna,rnb-1,rnab,rka-1,rkb,rkab+1)
E2 = cbind(rna,rnb,rnab,rka-1,rkb,rkab+1)
E3 = cbind(rna-1,rnb,rnab,rka,rkb-1,rkab+1)
E4 = cbind(rna,rnb,rnab,rka,rkb-1,rkab+1)
VDelta = Matrix(0,nrow= 100,ncol= 4,sparse=TRUE)
N_a<- cbind(E1[,1]+E1[,3]+E1[,4]+E1[,6],E2[,1]+E2[,3]+E2[,4]+E2[,6],E3[,1]+E3[,3]+E3[,4]+E3[,6],E4[,1]+E4[,3]+E4[,4]+E4[,6])
N_b<- cbind(E1[,2]+E1[,3]+E1[,5]+E1[,6],E2[,2]+E2[,3]+E2[,5]+E2[,6],E3[,2]+E3[,3]+E3[,5]+E3[,6],E4[,2]+E4[,3]+E4[,5]+E4[,6])
Mab <- M_0*(1-N_b/K_b)
Mba <- M_0*(1-N_a/K_a)
lambda_ab<- 2/(Mab+Mba)
C_b = 0.4
C_a = 0.4
fun = function(i){
if(i == 2) VDelta[,2] <- C_b*(E2[,6] +1)
else if (i == 4) VDelta[,4] <- C_a*(E4[,6] +1)
else if (i == 1) VDelta[,1] <- lambda_ab[,1]*E1[,6]
else VDelta[,3] <- lambda_ab[,3]*E3[,6]
VDelta[,i] = VDelta[,i]
}
no_cores = detectCores()
cl<-makeCluster(no_cores)
clusterExport(cl, "fun")
clusterExport(cl, "lambda_na")
clusterExport(cl, "lambda_nb")
clusterExport(cl, "Mab")
clusterExport(cl, "Mba")
clusterExport(cl, "lambda_ab")
clusterExport(cl, "E1")
clusterExport(cl, "E2")
clusterExport(cl, "E3")
clusterExport(cl, "E4")
clusterExport(cl, "C_b")
clusterExport(cl, "C_a")
clusterExport(cl, "VDelta")
V = parSapply(cl = cl, 1:4,fun)
stopCluster(cl)
然后,我收到了这个错误:
Error in checkForRemoteErrors(val) :
4 nodes produced errors; first error: object of type 'S4' is not subsettable
答案 0 :(得分:0)
如果将Matrix
程序包创建的矩阵导出到群集工作程序,则必须使用以下内容将Matrix
加载到工作程序上:
clusterEvalQ(cl, library(Matrix))
我还建议您将输出结合起来以提高效率和可读性:
clusterExport(cl, c("fun", "lambda_na", "lambda_nb", "Mab"))