在R中如何并行创建大矩阵

时间:2016-07-07 15:36:34

标签: r matrix parallel-processing

现在我有一个很大的矩阵来构建。这非常耗时。所以我想要并行完成。例如,矩阵是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

1 个答案:

答案 0 :(得分:0)

如果将Matrix程序包创建的矩阵导出到群集工作程序,则必须使用以下内容将Matrix加载到工作程序上:

clusterEvalQ(cl, library(Matrix))

我还建议您将输出结合起来以提高效率和可读性:

clusterExport(cl, c("fun", "lambda_na", "lambda_nb", "Mab"))