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

news2024/11/19 9:34:10

目录

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)

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

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

相关文章

领航优配:医药股发力拉升,双成药业等涨停,科源制药等大涨

医药股8日盘中拉升走高&#xff0c;到发稿&#xff0c;科源制药涨超16%&#xff0c;盘中一度冲击涨停&#xff1b;北陆药业涨超10%&#xff0c;精华制药、双成药业、海欣股份、奇特制药、龙津药业、永安药业等涨停&#xff0c;诚达药业、特一药业涨逾8%。 音讯面上&#xff0c;…

《实战AI模型》:GPT语义缓存为什么用GPTCache而不是Redis?

为什么不是Redis? 验证完可行性,便到了搭建系统的环节。这里我有一点必须要分享,在搭建 ChatGPT 缓存系统时,Redis 并不是我们的首选。 个人而言,我很喜欢用 Redis,它性能出色又十分灵活,适用于各种应用。但是 Redis 使用键值数据模型是无法查询近似键的。 如果用户提…

天!刚进公司的00后凭这套大屏模板直接涨薪5K,这是什么加薪利器

现在这世道&#xff0c;对普通人来说有一份谋生的工作真的都是奢求。前几天&#xff0c;坐在老李旁边&#xff0c;在公司待了10多年的老员工被叫到主管办公室说裁员的事情&#xff0c;他本来以为就是个普通的工作讨论&#xff0c;结果是通知他被裁员了&#xff0c;出来后整个人…

ESRVCC准备阶段优化提升方案

一、eSRVCC信令流程 UE发测量报告给eNb;基于测量报告&#xff0c;源eNb触发到GERAN的SRVCC切换流程&#xff1b;源eNb发送Handover Required 消息给源MME&#xff0c;消息中携带Target ID, generic Source to Target Transparent Container, SRVCC HO Indication等信息&#xf…

企业邮箱安全评估:选择最佳安全性的企业邮箱

企业在网络安全技术上投入了数十亿美元&#xff0c;但当涉及到邮箱安全时&#xff0c;风险甚至更高。随着网络钓鱼攻击、勒索软件和其他恶意威胁的兴起&#xff0c;确保邮箱免受入侵至关重要。 幸运的是&#xff0c;有许多安全解决方案和方法可供企业使用&#xff0c;包括: 反垃…

2023年国内最新的CRM系统排名

随着互联网技术的发展和竞争的激烈&#xff0c;越来越多的企业将目光放到CRM上&#xff0c;希望可以提高效率和收入。针对正在选型的企业&#xff0c;这里有一份国内crm系统排名【2023最新】&#xff0c;请注意查收。 1、Zoho CRM Zoho CRM是一款知名的在线CRM系统&#xff0…

uniapp开发小程序实现考勤打卡,附带源码

效果图&#xff1a; 考勤打卡三步走&#xff1a; 在地图上绘制打卡区域&#xff1a; uniapp开发小程序之在地图上进行绘制图形&#xff0c;并将经纬度转为固定格式的字符串_uniapp 绘制地图_阿晨12138的博客-CSDN博客 获取到用户定位&#xff0c;并跳转到当前用户定位&#xf…

【2023年11月第四版教材】《第2章-信息技术发展之存储和数据库(第二部分)》

第2章-信息技术发展之存储和数据库&#xff08;第二部分&#xff09; 3 存储和数据库3.1 存储系统架构3.2 存储技术3.3 数据库体系结构3.4 常用存储数据库类型优缺点 3 存储和数据库 3.1 存储系统架构 存储系统架构DASNASSAN安装难易度不一定简单困难数据传输协议SCSI/FC/ATA…

谷歌关闭跨域限制.(生成一个开发浏览器),Chrome关闭跨域

(一)、首先找到浏览器在电脑磁盘中的位置,并复制 (二)、复制一个浏览器的快捷方式到桌面(不影响正常浏览器) (三)、chrom鼠标右键属性&#xff0c;修改快捷方式的目标 &#xff08;四&#xff09;chrome.exe 后面添加 --disable-web-security --user-data-dir 复制的Chrome浏览…

视频监控汇聚EasyCVR平台WebRTC流地址无法播放的原因排查

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

ZIG:理解未来编程语言的视角

文章目录 摘要&#xff1a;引言&#xff1a;性能简洁性和模块化避免常见错误和陷阱总结&#xff1a;参考资料&#x1f4d1;: 摘要&#xff1a; 本文介绍了新兴编程语言ZIG的目标和特点&#xff0c;包括高性能、简洁性和模块化&#xff0c;并分析了这些特点是如何通过语言设计来…

CC++内存管理与模版初阶

目录 四、C&C内存管理 (一)C/C内存分布 (二)C内存管理方式 1、new/delete操作内置类型 2、new和delete操作自定义类型 (三)operator new与operator delete函数 (四)new和delete的实现原理 1、内置类型 2、自定义类型 (五)定位new表达式(placement-new) (六)八股文 1、n…

Keburnetes pod概念 策略

Pod基础概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和D…

Flowable-结束事件-空结束事件

目录 定义图形标记XML内容 定义 空结束事件是最常见的一种结束事件&#xff0c;也是最简单的一种结束事件&#xff0c;只要把结束任务置于流程 或分支的最后节点&#xff0c;流程实例运行到该节点的时候&#xff0c;流程引擎就会结束该流程实例或分支。前面提 到&#xff0c;结…

Springboot中整合netty启动后,项目无法正常启动?

1.现象描述 netty等一般放在程序启动后再启动&#xff0c;多以下面方式启动&#xff1a; Component Order(value 2) public class NettyUdpServer implements ApplicationRunner {如果在 Order 后面还有其它模块被启动&#xff0c;那么其它模块就会被阻塞。 2.原因分析 主…

ArcGIS Pro实践技术应用——暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用全流程科研能力提升

查看原文>>>ArcGIS Pro实践技术应用——暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合能力 本文将利用ArcGIS Pro 将您的 GIS 工作组织到工程中&#xff0c;您可以使用 ArcGIS Pro 映射 2D 和 3D 数据。借助 ArcGIS Pro&#xff…

装备制造业行业报告最新发布!

随着“十四五”战略规划的全力推动&#xff0c;物联网、5G、人工智能等新兴技术快速发展&#xff0c;制造装备智能化和自动化成为目前制造业发展的主要方向&#xff0c;重点推进高档数控机床与基础制造装备&#xff0c;自动化成套生产线&#xff0c;智能控制系统&#xff0c;精…

教程:通过navicat修改视频监控EasyCVR云平台的登录密码

TSINGSEE青犀视频监控管理平台EasyCVR可以根据不同的应用场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;平台可实现视频实时直播、云端录像、云存储、回放与检索、告警上报、视频快照、…

揭秘压力测试:从报告中看软件的极限

压力测试简介 压力测试&#xff0c;对于软件开发和测试领域的人来说&#xff0c;绝不是一个陌生的词汇。但是对于许多人来说&#xff0c;它的真正含义、目的和重要性可能仍然是一个迷。那么&#xff0c;什么是压力测试&#xff0c;为什么它如此关键&#xff1f; 压力测试是一…

[excel]vlookup函数对相同的ip进行关联

一、需求&#xff08;由于ip不可泄漏所以简化如下&#xff09; 有两个sheet: 找到sheet1在sheet2中存在的ip&#xff0c;也就是找到有漏洞的ip 二、实现 vlookup函数有4个参数 第一个:当前表要匹配的列&#xff0c;选择第一个sheet当前行需要处理的ip即可 第二个:第二个shee…