找不到r低版本_R的多进程使用与改进

R的多进程使用与改进

在R中需要使用多进程时,常见方案是使用foreachdoParallel的组合。

foreach

foreach包中最重要的是foreach函数,该函数创建一个foreach对象,随后串行或并行的执行表达式。

library(foreach)?foreach

out:

foreach(  ...,  .combine,  .init,  .final = NULL,  .inorder = TRUE,  .multicombine = FALSE,  .maxcombine = if (.multicombine) 100 else 2,  .errorhandling = c("stop", "remove", "pass"),  .packages = NULL,  .export = NULL,  .noexport = NULL,  .verbose = FALSE)e1 %:% e2when(cond)obj %do% exobj %dopar% extimes(n)

foreach函数在创建时常用的几个参数为:

...: 表达式中使用的变量。

.packages: 表达式依赖的包,字符向量。

.export: 表达式依赖的变量,字符向量。

.combine: 运算后结果的组合方式,默认为列表,可选 'c' 'cbind' 'rbind' '+' '*'等。

.errorhandling: 当运行中出现错误时的处理方式。

使用时,对象后接%do%为串行,%dopar%为并行。

foreach(i=1:3) %do%    sqrt(i)

out:

[[1]][1] 1[[2]][1] 1.414214[[3]][1] 1.732051

当使用%do%执行时,程序将会自动忽略.packages.export变量。

如果需要使用多进程,不只需要更换成%dopar%,你还需要注册集群,执行,结束集群。

library(doParallel)cl = makeCluster(4)  #注册4个进程的集群registerDoParallel(cl)foreach(i=1:3) %dopar% sqrt(i)stopCluster(cl) # 记得结束集群

包装

对多进程进行包装,形成runParallel函数。

library(foreach)library(doParallel)runParallel = function(FUN,PARAMS,packages = NULL,export = NULL){    cl = makeCluster(4)  registerDoParallel(cl)  N = length(PARAMS)  R = foreach(    i = 1:N,    .packages = packages,    .export = export,    .errorhandling = 'stop'  ) %dopar%    {      r = do.call(FUN, PARAMS[[i]])      r    }   stopCluster(cl)  R}

程序中的do.call能够使用提供的参数运行FUN函数。

runParallel函数传入FUN与并行参数的列表集合PARAMS,就可以使用FUN对每个值进行处理,然后返回全部值。

问题

在实际使用中遇到这样一个问题,在这里把问题稍微简化一下。

有两个文件,do_some_thing.Rdo_some_other_thing.R,里面各自编写了一个函数。

do_some_thing.R

do_some_thing = function(x){  do_some_other_thing(x**2)}

do_some_other_thing.R

do_some_other_thing = function(x){  x / 2}

很明显,do_some_thing.R中引用了do_some_other_thing.R中的函数。

现在我source这两个文件并暴露这两个函数,编写一个函数调用do_some_thing

some_thing = new.env()source('do_some_thing.R',local = some_thing)some_other_thing = new.env()source('do_some_other_thing.R',local = some_other_thing)attach(some_thing)attach(some_other_thing)fun = function(x){do_some_thing(x+1)}

然后进行多进程调用。

params = lapply(1:10, list)runParallel(fun,params)

得到错误。

Error in { : task 1 failed - "没有"do_some_thing"这个函数"

找不到do_some_thing函数,然而当我们加上所有可能的.export变量后。

runParallel(fun,params,export=c('do_some_thing','do_some_other_thing','some_thing','some_other_thing'))

仍然失败。

 Error in { : task 1 failed - "没有"do_some_other_thing"这个函数" 

有趣的是找不到的函数变成了do_some_other_thing,然而我明明export这个变量了啊。

在搜索中,回答普遍认为doParallel存在设计缺陷,它不能顺利的找到函数内调用的其他自定义函数。

在不停的搜索过后,我终于找到了一个解决方案,使用doFuture[1]

doFuture包会自动解决这类依赖问题,无需提供.packages.export参数,同时无需手动结束集群。

一个更改后的版本是这样的。

runParallel = function(FUN,PARAMS){    registerDoFuture()  plan(multisession, workers = 4)   #在这里指定进程数  N = length(PARAMS)  R = foreach(    i = 1:N,    .errorhandling = 'stop'  ) %dopar%    {      r = do.call(FUN, PARAMS[[i]])      r    }   R}
runParallel(fun,params)

out:

[[1]][1] 2[[2]][1] 4.5······

成功。

十分推荐doFuture包!

我是 SSSimon Yang,关注我,用code解读世界

957a4fc30647cb62c86a8c72e93b6b5e.png

References

[1] doFuture包: https://github.com/HenrikBengtsson/doFuture

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

药品研发 计算机系统验证,基于验证的药品研发项目申报系统的设计

摘要:目前国家大力推进信息化与工业化深度融合,提倡"互联网"的概念,信息化已经是现今的一个热名词.计算机系统在各行各业中扮演越来越重要的角色,计算机信息化已经不仅用于信息的管理,更融入了我们日常生活的每一个角落,比如购物,支付等.对于处于制造行业…

html让图片移动到一定位置_百度移动搜索优化指南2.0

百度移动搜索优化指南 2.0前期准备工作【域名】与 PC 网站一样,域名是用户对一个网站的第一印象。一个好的移动域名,不仅容易记忆、易于输入,还能方便用户向其他人推荐。域名应尽量简短易懂,越短的域名记忆成本越低,越…

ddr5内存上市时间_DDR5内存即将开始量产!DDR4内存史低价重现

本月中旬,JEDEC协会正式公布了DDR5标准,起步4800Mbps,未来可以达到6400Mbps,是DDR4内存的两倍多,最高有望达到DDR5-8400的水平。01、DDR5内存要来了DDR5标准公布之后,全球三大DRAM工厂——三星、SK海力士及…

电大法学本科计算机考试题,2016年电大-电大法学本科计算机网考答案.doc

2016年电大-电大法学本科计算机网考答案"更改默认主页"是在Internet Explorer浏览器的选项卡中进行设置,这个选项卡是____。D、常规"美国信息交换标准代码"的缩写是______。 B、ASCII1994年4月20日我国被国际上正式承认为接入Internet的国家,所…

32位mysql安装包_关于Mysql的安装

在安装之前,为保证能够安装成功,请您尝试以下操作:1、卸载原有mysql;2、搜索C:盘中是否有残余的mysql文件,主要是log文件,全部删除;3、为保证能够正常连接服务器,尽量关闭电脑防火墙&#xff1b…

hive sqoop 分区导入_利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中

测试:利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中。需要注意的地方:1,要添加hive.metastore.uris这个参数。否则无法将数据加载到hive表中。并且,如果一个xml文本中有多个这种操作的话,每个…

山东初二计算机会考,2017山东莱芜初二会考科目时间安排:6月14日

考试科目初中学业考试科目、分值和考试时长分别为:语文、数学、英语三科满分均为120分,考试时长均为120分钟,均按原始得分计入总分;思想品德、化学、历史、地理、生物满分均为100分,考试时长均为90分钟,均按考试分数50…

安装 ubuntu18_Ubuntu18.04安装docker及nvidia docker

Ubuntu18.04安装docker及nvidia docker 2之前的时候记得安装完docker之后还需要安装单独的nvidia docker 2,现在的话只需要安装nvidia container toolkit即可1、docker安装官网上又详细的介绍Install Docker Engine on Ubuntu​docs.docker.com或者sudo apt-get upd…

google账号解除游戏绑定_成长守护平台解除实名认证 公众号解绑操作流程

微信成长守护平台是一款培养孩子健康游戏习惯的游戏管控工具,那么微信成长守护平台怎么解除王者荣耀防沉迷呢?接下来小编就给大家带来了解除实名认证方法介绍,一起来看看吧!先简单了解一下游戏成长守护平台,它的运作方…

微软云服务器怎么注销,Microsoft 账户删除及注销

您好,了解到您要取消与当前Microsoft账户的连接。设置-账户-你的账户中,看下有没有断开连接的选项。现在是在第一次开机后的配置界面直接输入了这个邮箱账户吗?如果是这样的话,最好使用重置功能,选择不保留个人文件进行…

如何把python文件发给别人没_python怎么将py文件弄成exe

pandas 生成一列是另一列的累加结果,怎么做与怪物战斗的人,应当小心自己不要成为怪物。当你远远凝视深渊时,深渊也在凝视你。 pandas绘图不显示python用pandas库的绘图语句绘图,如何看到图? left pd.DataFrame({可以显…

混凝土地坪机器人_地面整平机器人:精准又高效,轻松摆“平”混凝土

随着国内经济不断发展,工业厂房、大型广场、体育场、停车场等大面积场地的建设需求越来越多。这类场地大多使用混凝土现场浇筑地基,然后再覆盖地砖或地坪漆,因此对基础层的平整度提出了很高的要求。传统的混凝土地坪施工方法是人工找平&#…

大学计算机成绩统计表怎么做,wps怎么制作成绩表 wps设计成绩统计表的步骤方法...

当我们使用wps统计数据时,如果我们需要制作一个统计成绩的表格,可是怎么制作成绩表吗?其实方法非常的简单,下面教程之家网为大家分享wps设计成绩统计表的步骤方法,不会制作的朋友可以参考下面的步骤方法自己制作即可。wps怎么制作…

chackbox的值 php获取_最详细最全的PHP面试题(附答案)

这篇文章介绍的内容是关于最全最详细的PHP面试题(带有答案),有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下相关推荐:程序猿的生活:面试12家公司,收获9个offer,2020年PHP 面试问题…

python适合安装什么开发环境_python开发环境安装

1、首先安装python-3.4.2.msi,此为python主程序,双击安装,根据自身的情况做选择,也可以使用默认设置,一路next也没什么问题。 2、设置环境变量>编辑Path,在最后加上你的python安装路径。我的安装路径是&…

服务器iis的作用,IIS是什么 IIS服务组件有什么作用

在网上或者一些技术社区我们经常会遇到一些讨论IIS问题文章。那么究竟IIS是什么?有什么用呢?不少电脑爱好者对IIS都充满兴趣,以下脚本之家小编为大家简单介绍下。IIS是什么?IIS是Internet Information Services英文全称的缩写,是…

服务器ssr进程启动怎么运行,要SSR? NUXT项目从初始化到部署服务器流程全记录

首先,简单介绍一下, nuxt.js 是什么Nuxt.js 是一个 Vue.js的SSR通用框架,最常用的就是用来作SSR(服务器端渲染)。首先说下 SSR,最近很热的词,意为 Server Side Rendering(服务端渲染),目的是为了解决单页面应用的 SEO 优化 的问题…

4修改初始值_Java基础语法 --4(连载)

第一部分 : IDEA开发工具参见 :IEDA的安装请参考文件夹PPT中的 04_IDEA.ppt1.数组1.1 数组介绍​ 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 1.2 数组的定义格式1.2.1 第一种格式​ 数据类型[] 数组名​ 示例:int[] ar…

python字典常用方法_Python 字典的常见操作

字典 字典的增删改查 字典的创建方式: #创建字典类型 info {name:李白,age:25,sex:男} msg{user01:Longzeluola,user02:xiaozemaliya,user03:cangjingkong} 字典存储数据的时候,采取的是key:value的形式,是一组无序的存储。在需要的时候通过k…

重邮计算机导师评价,李章勇_重庆邮电大学研究生导师信息

科研工作 :科研项目1.(主持)基于电-机复合机制的EIT胃动力无创检测与评价方法研究,2016-2019年,国家自然科技基金,经费71.2万元。2.(第三)基于心电信号特征与信道量化参数的体域网安全技术研究及实现设计,2…