在windows中使用parLapply函数执行并行计算

目录

1-lapply()函数介绍:

例子1:

 例子2:

例子3:

2-在Windows使用并行计算,使用parLapply()函数

2.1-并行计算的准备阶段:

2.2-parLapply()函数介绍

2.3-使用parLapply()函数编写执行并行计算

2.4-对parLapply(cl,x,fun)中需要的R对象,通过clusterExport(cl, varlist  )传递需要的变量,通过clusterEvalQ(cl, library(MASS))传递需要的包

2.5-如果parLapply(cl,x,fun)中的fun如何编写成功?

2.6-parLapply(cl, x, fun)中的fun不要出现print()函数

3-在非Windows中使用mclapply()函数


在介绍执行并行计算的parLapply()函数之前,先介绍与其函数使用高度相似的lapply()函数。可以说,lapply()函数是并行函数parLapply()对应的非并行版本函数。在使用时,parLapply()函数的参数与lapply()函数参数一样,只不过在第一个参数是设置集群即cl=makeCluster(20)。

1-lapply()函数介绍:

为什么介绍这个函数呢?因为在windows中使用parLapply()函数和lapply()的结构和用法是非常相似的,我们只需要将原本用lapply(x, fun)迭代函数 直接改写成 parLapply(makeCluster(c1), x, fun)即可,这里的直接改写是非常简单的,只需要设置使用计算机的核数,后面的参数直接挪到parLapply()中。

lapply() :线性数据迭代

lapply是list(列表)和apply(应用)的组合,函数的作用:对一个列表型或者向量型数据应用一个函数,返回值不区分处理对象,皆是列表结构。这个函数开头的第一个字母“l”表明这个函数的返回类型为列表。

返回值的元素个数与处理对象中的元素个数相同。

该函数的语法结构为:

lapply(X, FUN...)

其中

  1. X代表需要执行运算的列表或者向量;
  2. FUN代表需要运行的函数,这个参数的自定义范围非常广,用户可以将几百行代码封装为要给function(函数)来设置该参数;
  3. 三个点 表示FUN中的相应参数设置。

例子1:

使用均值函数mean来分别计算向量x、y和z的平均值,最后结果会以列表的形式现实在console中。

> x <- 1:10
> y <- 1:10
> z <- 1:10
> lapply(list(x,y,z), mean)
[[1]]
[1] 5.5

[[2]]
[1] 5.5

[[3]]
[1] 5.5

 例子2:

> x <- c(1:10, NA)
> y <- c(1:10, NA)
> z <- c(1:10, NA)
> lapply(list(x,y,z), function(x) {mean(x, na.rm =T)})
[[1]]
[1] 5.5

[[2]]
[1] 5.5

[[3]]
[1] 5.5

例子3:

lapply函数等价于for循环,循环4次,每次花费时间5秒钟。总共预期花费时间为20秒=4*5秒

> for(i in 1:4){Sys.sleep(5)}
> lapply(1:4, function(i) Sys.sleep(5))
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

2-在Windows使用并行计算,使用parLapply()函数

2.1-并行计算的准备阶段:

只要开始执行并行,需要设置使用计算机的核数,以及关闭执行并行。

流程:设置并行计算的核数-->执行并行计算-->关闭并行计算的集群。

无论使使用哪种并行计算包,都是基于上述三个步骤,1-设置并行计算的核数;2 执行并行计算 3 关闭并行计算的集群。

library(parallel)

#Step1 设置并行计算使用的核数

num_cores <- detectCores(logical=FALSE) #返回的是计算机的物理核数 
cl <- makeCluster(num_cores)# 设置并行计算的核心数,这里num_cores是整数,合理即可
 
# Step2: 执行并行计算的任务
result <- parLapply(cl, x, fun)
 
# Step3: 关闭并行计算的集群
stopCluster(cl)

其中:detectCores()#这个函数中参数logical默认取值为TRUE,该函数返回的是计算机的线程数,如果设置logical=FALSE,返回的是物理核数/CPU。

例如计算机是12核24线程,

  • logical=TRUE,返回的是逻辑核数24线程;
  • logical=FALSE,返回的是物理核数12核。

2.2-parLapply()函数介绍

parLapply()函数,顾名思义,parallel+lapply即前者是并行的英文,选取了其前三个字母,后面是lapply函数,提示我们这个函数返回的是一个list列表对象,函数的用法与lapply是一样的,或者说是高度相似的。

在Windows 系统中使用parLapply()函数替换lapply函数,进行并行计算,只不过多了一个参数即设置集群makeCluster()。 

也就是说,parLapply( )和lapply( )函数是相似的,在执行并行运算的时候,只需要把之前用lapply()函数写的部分

lappy(x, fun)

改写成 

parLapply(makeCluster(4), x, fun)

其中makeCluster(4) 设置并行计算的核数为4.

2.3-使用parLapply()函数编写执行并行计算

对上面的例子3,在windows系统中使用parLapply()函数执行并行计算:

> system.time(for(i in 1:4){Sys.sleep(5)})
 用户  系统  流逝 
 0.00  0.00 20.02


> system.time(lapply(1:4,function(i)Sys.sleep(5)))
 用户  系统  流逝 
 0.02  0.00 20.02


system.time(parLapply(makeCluster(4),1:4, function(i) Sys.sleep(5)))
用户 系统 流逝 
0.04 0.01 5.97 

2.4-对parLapply(cl,x,fun)中需要的R对象,通过clusterExport(cl, varlist  )传递需要的变量,通过clusterEvalQ(cl, library(MASS))传递需要的包

执行并行运算parLapply(cl, x, fun)中的fun只加载BaseR中的函数和对象,对于其他的对象,需要我们通过clusterExport(cl,varlist)传递给这个fun。相当于整个fun是一个独立的自定义函数,一个脚本,整个脚本中但凡出现没有给值得变量,就会报错,提示你要加入哪些变量,整个过程需要不断地得调试,不断地的根据程序的报错提示,进行添加相关的变量。

其中varlist传递parLapply(cl,x,fun)中需要的R对象,这些R对象一般是全局变量,如自定义函数、各种数据、各种变量..

例子

#setup cluster using 5 cores

#load packages, export required data and variables

cl <- makeCluster(5)

clusterEvalQ(cl, {source("cluster_inc.R")}, c(library(RSNNS), library(MASS) ))

clusterExport(cl, c("tuning", "use.train.x", "use.train.y","use.test.x", "use.test.y"))

stopCluster(cl)

来源:Deep Learing with R for Beginners.

总结:clusterExport(cl, varlist)中的varlist需要放哪些R对象?当我们需要运行的代码中含有很多的自定义函数以及R对象的时候,不妨通过不断地根据consloe的报错信息向clusterExport中添加需要的变量。这个过程是调试!上述parLapply()函数中的fun包含的R代码非常多的时候,一定是要调试的,自己根据前后程序添加R对象,效率是低的。

2.5-如果parLapply(cl,x,fun)中的fun如何编写成功?

这里的fun,一般我们用的时候,通常是自定义函数,也就是说这个fun通常是我们自己编写的R函数,那么如何确保这个fun编写正确?需要不断地进行调试,即先不进行并行运算,单独运行fun_my(para1, para2, para3),其中假设这里的fun函数名为fun_my,含有三个参数para1, para2, para3,给这个函数实参,直接运行fun_my(para1, para2, para3)。

如果fun_my(para1, para2, para3)这个函数中还含有其他的自定义函数,这个时候,其他的自定义函数使用的R对象一定是fun_my()函数内部的产生的R对象,对于在fun_my()函数内部的某些R对象,但是当其他的自定义函数使用这些R对象的时候,一定要通过参数的形式将这些R对象传递进来。

例如:

#---------------------------------------------------------------
### necessary function ####
#---------------------------------------------------------------

h <- function(){
  x1 + x2
}


#---------------------------------------------------------------
### main function ####
#---------------------------------------------------------------

fun_my <- function(x){
  x2 <- 5

  h()
 ....other code ...
}


#----------------------------------------------------------------
# run 
#----------------------------------------------------------------
x1 <- 1:3
fun_my(x1)

[1] Error in h() : 找不到对象'x2'
这个例子中fun_my中的变量x2,没有通过参数传递给h()中,所有会报错,提示h()函数找不到x2对象,这个时候,我们需要把x2对象添加到h()函数的参数中,这就是调试的过程,修改后,为下面的结果:
#---------------------------------------------------------------
### necessary function ####
#---------------------------------------------------------------

h <- function(x1, x2){
  x1 + x2
}


#---------------------------------------------------------------
### main function ####
#---------------------------------------------------------------

fun_my <- function(x){
  x2 <- 5
  x1 <- x

  h(x1, x2)
 ....other code ...
}


#----------------------------------------------------------------
# run 
#----------------------------------------------------------------
x1 <- 1:3
fun_my(x1)

 也就是,我们要把fun_my这个自定义函数当作是一个自定义函数,当然了,它确实是一个自定义函数,但当自定义函数中套用自定义函数的时候,对于最外层的自定义函数,这个例子中是fun_my这个函数,一定要清楚的这个函数的对象,如果嵌套的其他自定义函数要使用这些参数,一定要通过函数的形参进行传递!!这个过程,很容易把fun_my()中产生的R对象当作是全局变量来看待。

当然,这个经验通过自己实际操作就能获得!

如何编写fun函数成功?不断地调试,根据错误信息,不断地调试。当fun函数中套用其他自定义函数时,如果对于没有通过参数传递但是确实用了fun函数的R对象,R会报错,会提示你,要添加哪些参数。

2.6-parLapply(cl, x, fun)中的fun不要出现print()函数

在用R进行并行计算的时候,不能用“cat()”或者“print()”之类的函数来追踪程序的运行进度,令人十分不快乐。尤其是当并行数目多或者程序复杂运行较慢的时候,你甚至都分不清它是在乖乖运行还是在偷懒休息,真是令人头秃。

其中:R语言的并行计算 - 知乎 (zhihu.com)写道:

 但是这里使用的系统是linux,而非windows系统,在windows系统下,使用的parLapply()来执行并行计算,此时在fun中不要出现print或者cat函数。

3-在非Windows中使用mclapply()函数

例如,上面例子3使用mclapply函数执行并行计算

system.time(

mclapply(1:4, function(i) Sys.sleep(5), mc.cores=4) 

)

其中参数mc.cores它告诉mclapply()函数自动将独立计算拆分为多少个进程。

参考:

《R数据科学实践:工具详解与案例分析》(2019年6月出版,机工社)

《R的极客理想:量化投资篇》(2018年1月出版,机工社)

《R: Predictive Analysis》(2017年3月出版 中国图书进出口) (介绍了parLapply函数执行并行计算)

《Deep Learning with R for Beginners》(2019年5月出版,中国图书进出口)

并行运算 R - 搜索结果 - 知乎 (zhihu.com)

【多核的春天】R语言里的并行计算 - 知乎 (zhihu.com) (介绍使用foreach函数执行并行计算)

R语言的并行计算 - 知乎 (zhihu.com)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ECRS工时分析:什么叫标准化作业管理?为什么要进行作业标准化管理

中国自古就有标准化。《孙子兵法》中&#xff0c;孙子训练射箭&#xff0c;射箭的姿势是“标准化操作”&#xff1b;中国武术中的套路是“标准化”&#xff1b;在中国古诗中&#xff0c;字数甚至被“标准化”来打开中国历史&#xff0c;“标准化”作业的例子数不胜数。 而在工厂…

国内常用的可视化工具软件,请收藏

可视化不单单指数据可视化&#xff0c;还包含了信息可视化、2D可视化、3D可视化等&#xff0c;可视化工具为前端设计人员提供了一种更简单的方法来创建可视化的表示形式。它们通常通过拖拉拽组件的形式实现可视化效果。 根据不同的项目需求选择合适的可视化工具将节省大量时间…

JavaSpring加载properties文件

手动加载 #properties文件 jdbc.driver1 <?xml version"1.0" encoding"UTF-8"?> <!-- 开启context命名空间--> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XM…

Linux系统调试课:Linux Kernel Printk

🚀返回专栏总目录 文章目录 0、printk 说明1、printk 日志等级设置2、屏蔽等级日志控制机制3、printk打印常用方式4、printk打印格式0、printk 说明 在开发Linux device Driver或者跟踪调试内核行为的时候经常要通过Log API来trace整个过程,Kernel API printk()是整个Kern…

PyTorch深度学习环境安装(Anaconda、CUDA、cuDNN)及关联PyCharm

1. 关系讲解 Tytorch&#xff1a;Python机器学习库&#xff0c;基于Torch&#xff0c;用于自然语言处理等应用程序 Anaconda&#xff1a;是默认的python包和环境管理工具&#xff0c;安装了anaconda&#xff0c;就默认安装了conda CUDA&#xff1a;CUDA是一种由显卡厂商NVIDI…

MPAS-A原理及陆面模式的基本概念

跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff0c;分别称为 MPAS-A&#xff08;大气模型&#xff09;、MPAS-O&#xff08;海洋模型&…

上下拉电阻

(一)上拉电阻&#xff1a;1、当TTL电路驱动COMS电路时&#xff0c;如果TTL电路输出的高电平低于COMS电路的最低高电平&#xff08;一般为3.5V&#xff09;&#xff0c;这时就需要在TTL的输出端接上拉电阻&#xff0c;以提高输出高电平的值。2、OC门电路必须加上拉电阻&#xff…

ffmpeg工具实用命令

说明&#xff1a;ffmpeg是一款非常好用的媒体操作工具&#xff0c;包含了许多对于视频、音频的操作&#xff0c;有些视频播放器&#xff0c;实际上就是套了一个ffmpeg的壳子。本文介绍ffmpeg的使用以及一些较为实用的命令。 安装 ffmpeg是命令行操作的&#xff0c;不需要安装…

PlanetScale vs. Neon - MySQL 和 Postgres 间的第二仗

本文为「数据库全方位对比系列」第三篇&#xff0c;该系列的前两部作品为&#xff1a; 全方位对比 Postgres 和 MySQL全方位对比 Postgres 和 MongoDB 根据 2023 年 Stack Overflow 调研&#xff0c;Postgres 已经取代 MySQL 成为最受欢迎和渴望的数据库了。 看起来 MySQL 和 …

中国首份仿生机器人产业全景报告发布!大模型带来加速度,三大指标决定竞争格局

AGI火热发展&#xff0c;让仿生机器人的实现补全了最后一块重要拼图。 一直以来&#xff0c;仿生机器人都代表人类对于科技的一种终极想象&#xff0c;备受产业圈热捧。 马斯克、雷军等&#xff0c;纷纷押注这一赛道。特斯拉全尺寸仿生机器人Optimus、小米全尺寸通用人形机器…

STM32芯片的内部架构介绍

STM32芯片由内核和片上外设两部分组成。STM32F103采用Cortex-M3内核&#xff0c;该内核由ARM公司设计。芯片生产厂商ST则负责在内核之外设计部件并生产整个芯片。这些内核之外的部件被称为核外外设或片上外设&#xff0c;如GPIO、USART&#xff08;串口&#xff09;、I2C、SPI等…

数据安全是企业发展之基,WorkPlus纯内网私有化部署保护隐私更安全

数字化时代&#xff0c;数据是企业生产、经营、战略等几乎所有经营活动所依赖、不可或缺的信息。企业通过数据资产管理&#xff0c;对外可以为客户提供更好的产品和服务&#xff0c;在组织内部又可以降低成本、提高效率、控制风险。所以&#xff0c;数据的价值和重要性不言而喻…

什么是智慧工地和智慧工地源码?

智慧工地将更多人工智能、传感技术、虚拟现实等高科技技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类物体中&#xff0c;并且被普遍互联&#xff0c;形成“物联网”&#xff0c;再与“互联网”整合在一起&#xff0c;实现工程管理干系人与工程施工现场的整合。智慧工…

【uniapp】滚动相关

1、滚动到一定区域&#xff0c;顶部内容置换并置顶 功能&#xff1a; 当我向下滚动时&#xff0c;当关注那一行快到顶部的时候&#xff0c;把左侧区域的内容切换成右侧区域的内容&#xff0c;并置顶 原先我使用v-if来显示隐藏&#xff0c;发现会出现闪屏的现象&#xff0c;后来…

修改el-select和el-input样式;修改element-plus的下拉框el-select样式

修改el-select样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更改:deep .el-input__wrapper {height: 42px;background-color: rgba(0,0,0,0)!important;box-shadow: 0 0 0 …

栈和队列经典面试题

目录 一、括号匹配问题 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 题目 思路 完整代码 二、用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 题目 思路 代码实现 构造一个栈 用队列实现栈的接口 第一个接口&#xff1a;创建…

小白到运维工程师自学之路 第七十二集 (半自动yum安装k8s集群)

一、准备环境 修改主机名 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node2 bashvim /etc/hosts 192.168.77.14 k8s-master 192.168.77.15 k8s-node1 192.168.77.16 k8s-node2 下载阿里源 wget -O /etc/yum…

华为路由器:IPSec加密GRE通道(GRE over IPsec)

IPSec加密GRE通道 由于GRE隧道不提供安全性保障&#xff0c;使用ipsec加密gre隧道是现网中比较常用的VPN部署&#xff0c;它的加密方式分为两种&#xff1a; 可以使用IPsec来加密隧道进行传输&#xff0c;叫做IPsec over GRE&#xff1b; 加密数据流后从隧道传输&#xff0c;…

湘大 XTU OJ 1097 排序 题解:c++ 函数库的使用 快速排序 归并排序 冒泡排序

一、链接 1097 排序 二、题目 Description N个整数&#xff0c;将其排序输出。 输入 第一行是一个整数K&#xff08;1<K<20&#xff09;&#xff0c;表示有多少个样例&#xff0c;每个样例的第一行是一个整数N&#xff08;1<N<1,000&#xff09;和一个字符X&…

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型&#xff0c;包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例&#xff0c;以…