并行`for`循环,以数组作为输出

sbg*_*sbg 4 arrays parallel-processing for-loop r

如何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  #
}
Run Code Online (Sandbox Code Playgroud)

我一直在寻找相关问题并认为我可以使用,foreach但我找不到将矩阵组合成数组的方法.

我是并行编程的新手,所以任何帮助都将非常感谢!

Ste*_*ton 12

你可以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
}
Run Code Online (Sandbox Code Playgroud)

这使用一个名为acombabind函数,它使用函数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)
Run Code Online (Sandbox Code Playgroud)

使用abind是有用的,因为它可以以各种方式组合矩阵和数组.此外,请注意重置dim属性可能会导致矩阵重复,这可能是大型阵列的问题.

请注意,最好使用脚本结束时关闭群集stopCluster(cl).