如何并行运行for
循环(因此我可以使用Windows机器上的所有处理器),结果是3维数组?我现在的代码大约需要一个小时才能运行,如下所示:
guad = array(NA,c(1680,170,15))
for (r in 1:15)
{
name = paste("P:/......",r,".csv",sep="")
pp = read.table(name,sep=",",header=T)
#lots of stuff to calculate x (which is a matrix)
guad[,,r]= x #
}
我一直在查看相关问题并认为我可以使用foreach
,但我找不到将矩阵组合成数组的方法。
我是并行编程的新手,所以非常感谢任何帮助!
答案 0 :(得分:11)
您可以使用foreach
功能abind
执行此操作。这是一个使用doParallel
包作为并行后端的示例,该后端非常便携:
library(doParallel)
library(abind)
cl <- makePSOCKcluster(3)
registerDoParallel(cl)
acomb <- function(...) abind(..., along=3)
guad <- foreach(r=1:4, .combine='acomb', .multicombine=TRUE) %dopar% {
x <- matrix(rnorm(16), 4) # compute x somehow
x # return x as the task result
}
这使用一个名为acomb
的组合函数,它使用abind
包中的abind
函数将集群工作者生成的矩阵组合成一个三维数组。
在这种情况下,您还可以使用cbind
合并结果,然后修改dim
属性,将生成的矩阵转换为3维数组:
guad <- foreach(r=1:4, .combine='cbind') %dopar% {
x <- matrix(rnorm(16), 4) # compute x somehow
x # return x as the task result
}
dim(guad) <- c(4,4,4)
使用abind
非常有用,因为它可以通过各种方式组合矩阵和数组。此外,请注意重置dim
属性可能会导致矩阵重复,这可能是大型阵列的问题。
请注意,最好使用stopCluster(cl)
在脚本末尾关闭群集。