R语言doParallel+foreach 并行计算初试牛刀「建议收藏」

R语言doParallel+foreach 并行计算初试牛刀「建议收藏」前言 因为我学习的需要,要做模拟,需要用到前人写好的函数,然后又需要大量的循环(模拟一百次,每次生成500条曲线,450条训练,50条做预测)。每次做个运算要半个小时左右,实在是受不了了之后,找了很多的博客和也下载了cran的帮助文档来看。最后终于一遍遍的试出来了。包的安装 首先需要将doParallel的包安装带上去,而doParallel的包基于foreach,iterators和par…

大家好,又见面了,我是你们的朋友全栈君。

前言

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

包的安装

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

正文

  首先还是检测电脑的核心数,既然要搞并行计算,肯定要利用多核心;要检测电脑核心数,就需要用到detecCores()函数,对于Windows系统下的intel I5和intel 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.pca 和quadratic,这个很重要。

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%时候就像sapply或lapply,%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.pca和quadratic两个函数,所以要在.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多核)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161821.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 对象拷贝方法beanutils_java copy方法

    java 对象拷贝方法beanutils_java copy方法一、简介:BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。二、用法:如果你有两个具有很多相同属性的JavaBean,一个很常见的情况…

    2022年9月28日
  • jpg转nv12_jpeg改jpg

    jpg转nv12_jpeg改jpg代码主要用到了libyuv库和libjpeg库。编译:g++demo.cpp-lyuv-ljpeg-odemoubuntu下测试(需安装ffmpeg,width以及height按实际情况填写):ffplay-itest.yuv-pixel_formatnv12-swidthxheightdemo:#include<stdio.h>#include<stdlib.h>#include<libyuv.h>#..

    2022年9月16日
  • Verilog语言入门

    基础#号后面加延迟时间,单位为一个单位时间b表示二进制、d表示十进制、o表示八进制、h表示十六进制十进制可以表示0-9,其他三种除了原有的表示外新增了X->逻辑不定态,Z->高阻态Verilog数值集合由:0代表逻辑0或假状态,1代表逻辑1或真状态,X代表逻辑不定态,Z代表高阻态表示格式:<位宽>’<基数><数值&…

    2022年4月6日
  • OpenWrite 博客群发使用步骤[通俗易懂]

    OpenWrite 博客群发使用步骤[通俗易懂]OpenWrite,做最懂自媒体的工具平台。主要是群发软件、博客导流公众号阅读全文工具媒体发布平台、博客群发平台、软文推广平台软文推广发布、博客发布官网引流科技小工具微信公众号Markdown编辑器、多平台免费图床配置Markdown编辑器的免费简洁流畅、文章一键群发等的免费自媒体运营工具助手注意:当前版本必须使用Chrome浏览器,并安装插件「OpenWrite助手」https://openwrite.cn/plugin-chrome/1、点击指定渠道图标,在新窗口登录渠道的账号

    2022年7月13日
  • Java线程池使用说明

    Java线程池使用说明

    2021年12月3日
  • Latex中的空格

    两个quad空格a\qquadb两个m的宽度quad空格a\quadb一个m的宽度大空格a\b1/3m宽度中等空格a\;b2/7m宽度小空格a\,b1/6m宽度没有空格ab

    2022年4月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号