r - R中的并行处理示例
问题描述
首先,我想说我是这个话题的新手。
其次,虽然我读了很多关于 R 中的并行处理的文章,但我仍然对它没有信心。
我刚刚在 R 中发明了模拟。那么有人可以用这个发明的代码帮助我理解并行处理吗?(我可以看到它是如何工作的)
我的代码如下(大随机数)
SimulateFn<-function(B,n){
M1=list()
for (i in 1:B){
M1[i]=(n^2)}
return(M1)}
SimulateFn(100000000,300000)
请你帮助我好吗?
解决方案
首先,并行化是将一个任务划分为多个子任务的过程,这些子任务由多个处理器或内核同时处理,它们之间可以独立也可以共享一些依赖关系——后一种情况需要更多的规划和关注。
这个过程有一些开销来调度子任务——比如将数据复制到每个处理器。也就是说,并行化对于快速计算毫无价值。在您的示例中,三个主要过程是索引 ( [
)、赋值 ( <-
) 和(快速)数学运算 ( ^
)。并行化的开销可能大于执行子任务的时间,因此在这种情况下并行化会导致性能下降!
尽管如此,R 中的简单并行化还是相当容易的。下面提供了一种使用doParallel包并行化任务的方法。其他方法包括使用包作为并行。
library(doParallel)
## choose number of processors/cores
cl <- makeCluster(2)
registerDoParallel(cl)
## register elapsed time to evaluate code snippet
## %dopar% execute code in parallale
B <- 100000; n <- 300000
ptime <- system.time({
M1=list()
foreach(i=1:B) %dopar% {
M1[i]=(n^2)
}
})
## %do% execute sequentially
stime <- system.time({
M1=list()
foreach(i=1:B) %do% {
M1[i]=(n^2)
}
})
我的计算机(2 核)上的运行时间分别为 59.472 和 44.932。显然,并行化并没有改善:确实,性能更差!
下面显示了一个更好的示例,其中主要任务在计算需求方面要昂贵得多:
x <- iris[which(iris[,5] != "setosa"), c(1,5)]
trials <- 10000
ptime <- system.time({
r <- foreach(icount(trials), .combine=cbind) %dopar% {
ind <- sample(100, 100, replace=TRUE)
result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
coefficients(result1)
}
})
stime <- system.time({
r <- foreach(icount(trials), .combine=cbind) %do% {
ind <- sample(100, 100, replace=TRUE)
result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
coefficients(result1)
}
})
经过时间分别为 24.709 和 34.502:增长 28%。
推荐阅读
- google-bigquery - 从执行查询连接到 BigQuery
- php - PHP日期x和日期y之间的所有日期
- php - 为什么我的 Wordpress 网站设置了 PHPSESSID cookie?
- python - Matplotlib - 散点图周围的边框
- ruby-on-rails - 如何配置设计用户查找条件而不仅仅是电子邮件?
- firebase - 如何在颤振上正确链接期货与火力交易?
- javascript - 请求索引 0,大小为 0
- lua - 根据lua中的敌人坐标定位角色
- mysql - Sql Query 获取最新查询
- php - 如何使用 file_get_contents 读取 html 文件中的 php 内容