use*_*616 2 parallel-processing r
我想并行化一个名为unparallelizedfnc的函数.该函数调用其他四个函数(需要很长时间才能计算)并存储结果.最后结果合并.考虑我的功能的玩具示例(当然这些不是我称之为的四个真实功能,仅用于演示).
如何在具有多个内核的计算机上并行化result1,result2,result3和result4的计算?我希望它可以在Windows,Linux和Mac OSX上运行.在这种情况下,不需要对并行化版本进行基准测试(由于开销会慢一些,但在我的实际代码中它会更快).
如果四个结果是相同的函数(但具有不同的数据),我可以使用并行for循环(foreach)或并行应用,但在这种情况下,函数是不同的.
unparallelizedfnc <- function(x) {
result1 <- sum(x)
result2 <- median(x)
result3 <- min(x)
result4 <- max(x)
result <- mean(c(result1,result2,result3, result4))
result
}
unparallelizedfnc(rnorm(100000))
Run Code Online (Sandbox Code Playgroud)
我首先根据@Jilber的建议纠正了你的功能:
unparallelizedfnc <- function(x) {
result1 <- sum(x)
result2 <- median(x)
result3 <- min(x)
result4 <- max(x)
result <- mean(c(result1,result2,result3, result4))
result
}
parallelizedfnc <- function(x) {
require(parallel)
funs <- list(sum,median,min,max)
mean(do.call("c",mclapply(funs,function(fun) fun(x),mc.cores = 4)))
}
set.seed(42)
x <- rnorm(1e8)
identical(unparallelizedfnc(x),parallelizedfnc(x))
#[1] TRUE
library(microbenchmark)
microbenchmark(unparallelizedfnc(x),parallelizedfnc(x),times=3)
# Unit: seconds
# expr min lq median uq max neval
# unparallelizedfnc(x) 3.155736 3.166381 3.177027 3.195497 3.213967 3
# parallelizedfnc(x) 5.047008 5.207747 5.368486 5.514221 5.659956 3
Run Code Online (Sandbox Code Playgroud)
请注意,sum等.太快,无法从并行化中受益.由于并行化开销,该功能需要更多时间.我假设您的真实用例具有较少优化的功能.
| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |