R中矩阵(或栅格)的并行求和
parallel summation of matrices (or rasters) in R
我有一长串要并行求和的大型矩阵(或栅格)。输出应该是一个矩阵。我尝试 foreach
使用 .combine='+'
函数,该函数有效,但似乎 .combine 仅适用于一个线程,因此没有加速。有什么建议么?谢谢
matrix.list <- list()
for(i in 1:10000) matrix.list[[i]] <- matrix(1,nrow=100,ncol=100)
library(foreach)
library(doMC)
registerDoMC(cores=2)
matrix.sum <- foreach(i=1:10000,.combine='+') %dopar% matrix.list[[i]]
您的问题是您只能并行执行 matrix.list[[i]]
,而 [[
对于列表来说非常快。 .combine
操作由master进程在所有并行任务完成后完成。
你应该像这样把你的列表分成几块:
set.seed(42)
n <- 1e3
matrix.list <- replicate(n, matrix(rnorm(1),nrow=1000,ncol=1000), simplify = FALSE)
system.time({
matrix.sum_s <- Reduce("+", matrix.list)
})
#user system elapsed
#1.83 1.25 3.08
library(foreach)
library(doParallel)
ncl <- 4
cl <- makeCluster(ncl)
registerDoParallel(cl)
system.time({
matrix.sum_p <- foreach(x = split(matrix.list, (seq_len(n) - 1) %/% (n/ncl)),
.combine='+') %dopar%
{Reduce("+", x)}
})
#user system elapsed
#6.49 35.97 46.97
stopCluster(cl)
all.equal(matrix.sum_s, matrix.sum_p)
#[1] TRUE
当然,并行化版本仍然比简单地使用Reduce
慢很多。为什么?因为 +
是一个快速的低级 (.Primitive
) 函数。 foreach
大部分时间都花在复制几GB的密集矩阵上。
我有一长串要并行求和的大型矩阵(或栅格)。输出应该是一个矩阵。我尝试 foreach
使用 .combine='+'
函数,该函数有效,但似乎 .combine 仅适用于一个线程,因此没有加速。有什么建议么?谢谢
matrix.list <- list()
for(i in 1:10000) matrix.list[[i]] <- matrix(1,nrow=100,ncol=100)
library(foreach)
library(doMC)
registerDoMC(cores=2)
matrix.sum <- foreach(i=1:10000,.combine='+') %dopar% matrix.list[[i]]
您的问题是您只能并行执行 matrix.list[[i]]
,而 [[
对于列表来说非常快。 .combine
操作由master进程在所有并行任务完成后完成。
你应该像这样把你的列表分成几块:
set.seed(42)
n <- 1e3
matrix.list <- replicate(n, matrix(rnorm(1),nrow=1000,ncol=1000), simplify = FALSE)
system.time({
matrix.sum_s <- Reduce("+", matrix.list)
})
#user system elapsed
#1.83 1.25 3.08
library(foreach)
library(doParallel)
ncl <- 4
cl <- makeCluster(ncl)
registerDoParallel(cl)
system.time({
matrix.sum_p <- foreach(x = split(matrix.list, (seq_len(n) - 1) %/% (n/ncl)),
.combine='+') %dopar%
{Reduce("+", x)}
})
#user system elapsed
#6.49 35.97 46.97
stopCluster(cl)
all.equal(matrix.sum_s, matrix.sum_p)
#[1] TRUE
当然,并行化版本仍然比简单地使用Reduce
慢很多。为什么?因为 +
是一个快速的低级 (.Primitive
) 函数。 foreach
大部分时间都花在复制几GB的密集矩阵上。