R语言doParallel+foreach 并行计算初试牛刀

前言

 因为我学习的需要,要做模拟,需要用到前人写好的函数,然后又需要大量的循环(模拟一百次,每次生成500条曲线,450条训练,50条做预测)。每次做个运算要半个小时左右,实在是受不了了之后,找了很多的博客和也下载了cran的帮助文档来看。最后终于一遍遍的试出来了。

包的安装

 首先需要将doParallel的包安装带上去,而doParallel的包基于foreach,iteratorsparallel,parallel是R语言内置的包,所以要实际安装的包总共有三个。

正文

  首先还是检测电脑的核心数,既然要搞并行计算,肯定要利用多核心;要检测电脑核心数,就需要用到detecCores()函数,对于Windows系统下的intel I5intel I7处理器,一般要用detecCores(logical = F)来获得实际的物理核心。我用的是学校配备的8700,所以检测出来的就是6个。

library(doParallel)
library(foreach)
cl.cores = detecCores(logical = F)
cl <- makeCluster(cl.cores)
registerDoparallel(cl)  # 我调用了所有的核心,也可以(cl-1),少调用一个核心

 以上是前期设置,下面是我自己模拟代码的部分展示,其中要注意的是我的ffunopare.knn.gcv函数调用了内存中另外两个函数,分别是semmimetric.pcaquadratic,这个很重要。

func <- function(ii){
    result.pred <- ffunopare.knn.gcv(a,b,v,5,kind.of.kernel="quadratic",semimetric="pca")
    Response.predicted <- result.pred$Predicted.values
    ase.reg[i] <- round(sum((pi/3)*(1/100)*(abs(Response2-Response.predicted))),8)
    }
  RE<-mean(ase.reg)
  return(RE)
}

参数解读(参考链接1 )


  • %do%: 严格按照顺序执行任务(所以,也就非并行计算),%dopar%并行执行任务,%do%时候就像sapplylapply%dopar%就是并行启动器

  • .combine:运算之后结果的显示方式,default是list,“c”返回vector, cbind和rbind返回矩阵,"+“和”"可以返回rbind之后的“+”或者“”,帮你把数据整合起来,太良心了!!
    -.init:.combine函数的第一个变量

  • .final:返回最后结果

  • .inorder:TRUE则返回和原始输入相同顺序的结果(对结果的顺序要求严格的时候),FALSE返回没有顺序的结果(可以提高运算效率)。这个参数适合于设定对结果顺序没有需求的情况。

  • .muticombine:设定.combine函数的传递参数,default是FALSE表示其参数是2,TRUE可以设定多个参数

  • .maxcombine:设定.combine的最大参数

  • .errorhandling:如果循环中出现错误,对错误的处理方法

  • .packages:指定在%dopar%运算过程中依赖的package(%do%会忽略这个选项),用于并行一些机器学习算法。

  • .export:在编译函数的时候需要预先加载一些内容进去,类似parallel的clusterExport


下面就是并行计算的主函数部分,也就是调用foreach的部分。#因为ffunopare.knn.gcv要加载内存中的semimetric.pcaquadratic两个函数,所以要在.export参数中设置一下,有文章说要用list,笔者没有用,不过下面参考链接[1]中会给出。要注意,参数要使用%dopar%而不能使用%do%,后者就不是并行计算了。

x <- foreach(ii=1:100,.combine = "c",.export = c("semimetric.pca","quadratic"))%dopar% func(ii)

 最后要做的就是关闭集群

stopCluster(cl)

最后奉上结果,如下图,左图为并行计算,右图为非并行计算,也就是使用最基础的for循环的结果。请不要吐槽我的print(time)

并行计算for循环
并行计算是27分钟非并行计算是1个多小时

参考链接

  1. R︱foreach+doParallel并行+联用迭代器优化内存+并行机器学习算法.
  2. R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)
  3. R语言的并行运算(CPU多核)
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用Parallel.ForEach时,由于并行计算的特性,可能会出现计算错误的情况。这种错误可能由以下原因导致: 1. 竞争条件:并行计算时,多个线程可能会同时访问和修改共享的数据,导致数据不一致。例如,如果多个线程同时修改同一个变量的值,可能会导致计算错误。这种情况可以通过使用锁或其他同步机制来避免。 2. 数据依赖性:并行计算时,某些计算可能依赖于其他计算的结果,如果这些计算没有按照正确的顺序执行,可能会导致计算错误。例如,如果某个计算依赖于前面的结果,但是由于并行计算的特性,其执行顺序不确定,就可能导致计算错误。这种情况可以通过使用数据流图(Dataflow)或其他依赖管理机制来避免。 3. 硬件限制:并行计算时,可能会出现硬件限制,例如内存限制、线程池限制等,导致计算错误。这种情况可以通过调整硬件配置或使用更高效的算法来缓解。 4. 程序设计错误:并行计算时,可能会出现程序设计错误,例如算法实现错误、数据结构设计错误等,导致计算错误。这种情况可以通过仔细检查程序代码和算法实现来避免。 为了避免Parallel.ForEach运算中出现计算错误,可以采取以下措施: 1. 确保并行计算的线程安全性,避免出现竞争条件。 2. 管理计算的依赖关系,确保计算按照正确的顺序执行。 3. 调整硬件配置,确保计算能够正常运行。 4. 仔细检查程序代码和算法实现,避免出现程序设计错误。 总的来说,Parallel.ForEach是一个非常强大和高效的并行计算工具,但是在使用时需要注意以上问题,以确保计算的正确性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值