我正在使用大尺寸矩阵(1.5GB并且正在增长)。一个特定的功能是花费大量时间,它似乎是使用foreach包进行并行化的一个很好的候选者。我在Ubuntu上用registerDoParallel(cores = 4)运行它,带有4个内存和8GB RAM。当我使用foreach时,我理解将为所有4个进程制作一个大矩阵的副本。我很快就看到内存使用率达到100%。我read another发布建议使用bigmemory并使用attach.big.matrix(),因此进程可以共享相同的矩阵。我肯定有足够的RAM来保存内存中的副本。但是当我这样做时,我注意到执行所花费的时间实际上增加了。
user system elapsed
9889.944 185.590 2670.001 - DoParallel with 4 cores!
8931.887 92.214 4526.306 - DoParallel with 2 cores!
9320.523 150.122 9473.165 - DoParallel with 1 core!
1314.037 6.236 1320.290 - Serial execution without foreach and without big.matrix.
我无法对此提出解释。以下是我的代码。我已经尝试了一些其他的东西,例如向每个进程发送一个块(默认情况下foreach也似乎也这样做)。没有什么能比串行更快地执行。当我将内核设置为4时,我确实看到所有4个内核都以100%使用。使用bix.matrix似乎有超过1个内核的改进,但是从未使用过大矩阵的串行执行没有任何改进。
calcQIDiffForRow <- function(row, Desc){
mat <- attach.big.matrix(Desc)
x <- mat[row, ]
for(j in 1:(row - 1)) {
y <- mat[j, ]
...
}
return(val)
}
calcQIDiff <- function(mat){
registerDoParallel(cores=4)
desc <- describe(mat)
ret <- foreach(i = 1:nrow(mat), .combine=rbind, .multicombine=T,
.noexport=c("mat")) %dopar% calcQIDiffForRow(i, Desc)
return(ret)
}
system.time(QIdiff.parallel <- calcQIDiff(as.big.matrix(bigmatrix))).