美文网首页数据分析商业智能BI那点事儿玩转大数据
R语言多任务处理与并行运算包——foreach

R语言多任务处理与并行运算包——foreach

作者: 天善智能 | 来源:发表于2018-04-23 17:41 被阅读15次

杜雨,EasyCharts团队成员,R语言中文社区专栏作者

兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。

个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。 


相信大部分R语言初学者,在刚开始入门之处,都曾被告诫在处理多重复任务时,尽量不要使用显式的for循环,而要尽可能的使用R语言内置的apply组函数,这样可以极大地提高代码运行效率。

但是实际上除了内的apply组函数之外,你还有另外一个更好地选择,就是利用一些支持并行运算的扩展包,来发挥本地计算机的多和计算优势。

本篇要讲解的包是foreach包,这是一个支持在R语言中调用多进程功能的第三方包,之前在对比显式循环、矢量化函数以及多进程在数据抓取的效率一文中,曾经演示过具体的代码。

library("foreach")

library("doParallel")

foreach包执行任务的核心理念与传统的apply组函数基本一致,都是与split – apply – combine一致的流程,不过foreach比传统apply组函数的优越之处在于,它可以通过调用操作系统的多核运行性能来执行并行任务,这样特别是对于I/O密集型任务而言,可以大大节省代码执行效率。

foreach(...,#待输入的参数.combine,#结果返回后执行的数据合并操作(c代表合并为向量,list代表合并为列表,rbind代表合并为数据框).packages=NULL,#在多进程共享的程序包(仅对于非系统安装包必备).export=NULL,#未在当前环境中定义的数据对象.verbose=FALSE#是否打印运行信息)

以上函数中,第1个参数是必备参数,即必须有输入参数,结果默认返回list。

foreach函数用于定义执行多进程任务的函数,任务的执行则需要使用%do%/%dopar%函数,前者执行的是普通的单进程任务(与apply组函数一样),后者则可以执行多进程任务。

接下来我们演示一遍整个多进程任务的过程:

首先定义一个执行函数:

library("httr") library("jsonlite")

library("magrittr")

GETPDF <-  function(i){  url<-"https://index.toutiao.com/api/report"  headers<-c(            "Host"="index.toutiao.com",     "User-Agent"="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36"  )  payload <-list("page"=1,"size"=12)    payload[["page"]]=i    web <- GET(url,add_headers(.headers = headers),query = payload)    content <- web %>% content(as="text",encoding="UTF-8") %>% fromJSON() %>% `[[`(9)  }

2、执行多进程函数

方案1——使用%do%函数执行普通的向量运算

library("doParallel")#加载doParallel包用于之后注册进程

library("foreach")#导入foreach包

system.time({  cl<- makeCluster(4)        registerDoParallel(cl)#进行进程注册mydata1 <- foreach(

i=1:16,#输入等待请求的参数.combine=rbind,#返回结果的整合.packages = c("httr","jsonlite","magrittr")

#多个进程共享的系统环境) %dopar% GETPDF(i)  stopCluster(cl)})用户 系统 流逝0.080.012.18

方案2——使用%dopar%函数执行多进程的运算

system.time({  cl<-makeCluster(4)  registerDoParallel(cl)  mydata2 <- foreach(i=1:16,.combine=rbind) %do% GETPDF(i)  })用户 系统 流逝0.390.034.53

因为%do%操作是单进程的,因而即便启动多进程环境也是徒劳。

DT::datatable(mydata1)

可以看到,%dopar%操作比%do%操作仅仅节省了0.04秒左右,但是鉴于抓包的请求频率比较高,这样多进程所节省的时间效率感知不够明显。

system.time(mydata3 <- plyr::ldply(1:16,GETPDF))用户 系统 流逝0.320.004.54

整体时间效率比较:

ldply > %do% >  %dopar%4.54  > 4.53 >  2.18

从时间效率上来看,的确节省了将近50%的时间。如此高逼格的神器,怎能不学呢~~

如果你想要深入的去学ggplot2,但是又苦于平时学习、工作太忙木有时间研究浩如烟海的源文档,那也没关系,本小编最近花了不少功夫,把我自己学习ggplot2过程中的一些心得体会、学习经验、仿入坑指南精心整理,现已成功上线了R语言ggplot2可视化的视频课程,由天善智能独家发行,希望这门课程可以给你的R语言数据可视化学习带来更加丰富的体验。https://edu.hellobi.com/course/264

相关文章

网友评论

    本文标题:R语言多任务处理与并行运算包——foreach

    本文链接:https://www.haomeiwen.com/subject/havllftx.html