ITPub博客

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

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

作者:浪花小雨滴 时间:2020-06-16 15:04:10 0 删除 编辑

相信大部分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——使用%dopar%函数执行普通的向量运算

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.08 0.01 2.18

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

system.time({
  mydata2 <- foreach(i=1:16,.combine=rbind) %do% GETPDF(i)
  })

用户 系统 流逝 
0.39 0.03 4.53

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

DT::datatable(mydata1)

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

system.time(
mydata3 <- plyr::ldply(1:16,GETPDF)
)

用户 系统 流逝 
0.32 0.00 4.54

整体时间效率比较:

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

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

R语言爬虫实战课程通知:

1月16日晚,我将在天善智能分享2~3个小时的R语言爬虫课程,内容为目前为止R语言生态中关于数据抓取的相关工具使用、爬虫的基本流程、网页解析与抓取技巧、以及后期输出操作与处理等,几乎可以涵盖R语言爬虫初学者入门所面临的主要问题和难点:


R语言爬虫实战案例分享:

杜雨,EasyCharts团队成员,EasyCharts公众号及知乎专栏特约撰稿人。R语言中文社区专栏作者,微信公众号——“数据小魔方”创始人。兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。每天会为您推送Excel商务图表、R语言可视化及数据可视化精彩案例。个人公众号:数据小魔方(微信ID:datamofang)


直播时间:

2018年1月16日 20:00 - 22:00

分享内容

本次课程所有内容及案例均来自于本人平时学习练习过程中的心得和笔记总结,希望借此机会,将自己的爬虫学习历程与大家分享,并为R语言的爬虫生态改善以及工具的推广,贡献一份微薄之力,也是自己爬虫学习的阶段性总结。


课程大纲


一、爬虫的概念及基本流程


二、网络请求

2、常用网络请求的基本类型

2.1、GET请求详解

2.1.1参数传递

2.2、POST请求详解

2.2.1、application/x-www-form-urlencoded

2.2.2、application/json

2.2.3、text/xml

2.2.4、multipart/form-data

2.3、开发者工具与抓包分析基本流程

2.3.1、Chrome后台开发者工具

2.3.2、抓包报头参数分析(请求报头与相应报头)

2.3.3、Postman请求器的基本使用

2.4、RCurl/httr构造基本网络请求方法

2.4.1、GET请求构造(RCurl+httr)

2.4.2、POST请求构造(RCurl+httr)

2.4.3、快捷高阶函数(readtable、readlists、getlinks)


三、网页解析详解

3.1、json与xml结构数据结构分析

3.2、异常处理与循环跳出

3.3、Xpath公式

3.4、css表达式

3.5、二进制文件下载(pdf\jpg\mp3\mp4)

3.6、关系表入库(MYSQL)

3.7、lsit解析与非结构化数据存储(mongoDB)

3.8、基于反反爬虫的一些建议

3.9、显式循环、向量化函数、并行运算在数据爬取中的效率比较


四、实战案例

4.1、网易云课堂

4.2、知乎live

4.3、今日头条行业报告

4.4、B站视频信息


学习进阶建议:

1、正则表达式

2、自建IP代理池

3、学习Rwebdriver、RRSelenium浏览器驱动框架


参与方式


点击原文即可加入:


天善智能

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3153995/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: HBase 版本数量
请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    40024