R-并行计算

news2024/11/13 11:01:15

本文介绍在计算机多核上通过parallel包进行并行计算。

并行计算运算步骤:

  1. 加载并行计算包,如library(parallel)。
  2. 创建几个“workers”,通常一个workers=一个核(core);
  3. 这些workers什么都不知道,它们的全局环境没有变量,也没有加载的R包,所以无论你想让这些workers做什么你都需要提供相应的对象、库;
  4. 使用一些可以并行运行循环的函数,如parApply,parLapply,parSapply。
  5. 当使用完并行后端,且不需要workers的时候,停止它们,否则,它们将继续挂在内存中。

说明:

1-关于并行版本的循环函数。在BaseR中提到循环,有for、while用于循环的函数,也有apply家族函数。相应的,在并行运算中,也有并行运算的apply家族函数。

library(parallel)


# run this code instead to use all available CPU cores
#variable c1 is workers (clusters)
#启动workers,包括确定使用的workers数量。workers=cores
cl <- makeCluster(detectCores()) 


#将当前R中的变量(这里命名为object1和object2,是任何R对象)导出到新创建的workers的全局变量中,以便workers使用它们。注意第一个参数是workers。
clusterExport (cl, varlist = c("object1", "object2"))


#对some.vector中的每个元素,分别使用FUN作用,返回结果是向量。
#parSapply函数的第一个参数是workers;
#操作类似sapply函数,可先查阅saplly函数的用法。
#将返回结果存储在result对象中
result <- parSapply (cl, some.vector, FUN = function (i) {some.function1; some.function2})


#关闭workers
stopCluster (cl)


示例:

从标准正态分布中生成1e6个随机数,计算这些随机数的均值,这个过程重复100次。

非并行版本代码:

lapply (1:100, FUN = function (x) mean (rnorm (1000000)))

并行版本代码:

library (parallel)
cl <- makeCluster (4)
res <- parLapply (cl, X = 1:100, fun = function (x) mean (rnorm (1000000)))
stopCluster (cl)

注意:这里使用的lapply和parLapply,sapply函数是lapply函数的简化版,sapply函数返回的是向量,lapply返回的是列表。lapply(list +  apply),sapply (simplify+apply).

当计算机运行上述两个函数的时候,我们打开任务管理器(快捷键:ctrl+Alt+Del),非并行程序仅使用部分计算机容量,在这个例子中,非并行版本的程序仅使用了39%的CPU,而并行版本的CPU为100%。

 

 

 

 R语言的microbenchmark包来进行性能测试,microbenchmark函数是microbenchmark包中的一个函数,用于测量代码块的执行时间。microbenchmark函数的结果将返回一个数据框,其中包含了每次执行的时间结果,以及一些统计信息,如平均时间、最小时间、最大时间等。这段代码的目的是通过microbenchmark函数来测试和比较不同代码块的执行时间,以评估它们的性能。

mb <- microbenchmark::microbenchmark (
  {
    lapply (1:100, FUN = function (x) mean (rnorm (1e6)))
  },
  {
    library (parallel)
    cl <- makeCluster (4L)
    res <- parLapply (cl, X = 1:100, fun = function (x) mean (rnorm (1e6)))
    stopCluster (cl)
  }, 
  times = 10)
mb

运行结果:

Unit: seconds
...
      min       lq     mean   median       uq      max neval cld
 7.389548 7.522466 7.566548 7.585431 7.605311 7.703006    10   b
 2.853429 2.890022 2.954747 2.943975 2.968527 3.114184    10  a 

通过两个版本程序运行时间的对比,可以看到,并行版本的程序的计算时间没有比非并行版本的程序快4倍,因为我们使用的是4个核,按照预期应该是并行版本的程序运行速度要快4倍,没有达到这个预期原因是:管理并行也需要花费一些时间:拆分数据、将它们发送给单个workers,收集结果,并将结果合并在一起。

因此,并行计算适应于计算所花费的时间远高于R与单个内核通信所花费的时间。

事实上,如果将计算1e6个随机数的均值,增加到计算1e7个随机数的均值,重复100次,此时,并行版本的速度将增加几乎4倍(非并行83.8 vs 并行21.5).

注意:除非你有一台相当强大的计算机,否则不要尝试运行下面的代码,因为计算机运行下面的代码需要一段时间。注意到,下面的代码中,将重复次数减少到了5,否则需要更长的时间。

mb <- microbenchmark::microbenchmark (
  {
    lapply (1:100, FUN = function (x) mean (rnorm (1e7)))
  },
  {
    library (parallel)
    cl <- makeCluster (4L)
    res <- parLapply (cl, X = 1:100, fun = function (x) mean (rnorm (1e7)))
    stopCluster (cl)
  }, 
  times = 5)
mb
Unit: seconds
...
      min       lq     mean   median       uq      max neval cld
 83.08273 83.82933 83.95855 83.97395 84.39401 84.51273     5   b
 21.42050 21.43552 21.58001 21.49912 21.58116 21.96373     5  a 

参考:

Parallelization in R [David Zelený]

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

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

相关文章

第一次后端复习整理(JVM、Redis、反射)

1. JVM 文章仅为自身笔记 详情查看一篇文章掌握整个JVM&#xff0c;JVM超详细解析&#xff01;&#xff01;&#xff01; 1.1 什么是JVM jvm是Java虚拟机 1.2 Java文件的编译过程 程序员编写代码形成.java文件经过javac编译成.class文件再通过JVM的类加载器进入运行时数据…

Java云电子病历源码:电子病历在线编辑

SaaS模式Java版云HIS系统的子系统云电子病历系统源码&#xff0c;本系统采用前后端分离模式开发和部署&#xff0c;支持电子病历四级。 电子病历系统主要为医院住院部提供医疗记录依据&#xff0c;协助医务人员在医疗活动过程中通过信息化手段生成的文字、图表、图形、数据、影…

华为数通HCIP-EVPN基础

MP-BGP MP-BGP&#xff08;Multiprotocol Extensions for BGP-4&#xff09;在RFC4760中被定义&#xff0c;用于实现BGP-4的扩展以允许BGP携带多种网络层协议&#xff08;例如IPv6、L3VPN、EVPN等&#xff09;。这种扩展有很好的后向兼容性&#xff0c;即一个支持MP-BGP的路由…

Java Swing Mysql实现的电影票订票管理系统

Java swing mysql实现的电影票订票管理系统&#xff0c;主要实现的功能有&#xff1a;用户端&#xff1a;登录注册、查看电影信息、选择影院场次、选座购票、查看自己的影票、评价电影等功能。管理员&#xff1a;登录、电影管理、影院管理、场次管理、影票管理等功能。 需要源…

echarts统计图x轴文字过长,以省略号显示,鼠标经过提示全部内容

效果图如下 主要代码如下&#xff1a; //1.js代码内加入extension方法&#xff0c;chart参数是echarts实例 function extension(chart) {// 注意这里&#xff0c;是以X轴显示内容过长为例&#xff0c;如果是y轴的话&#xff0c;需要把params.componentType xAxis改为yAxis/…

Shell脚本学习-read命令

Shell变量可以直接赋值或者脚本传参的方式&#xff0c;还可以使用echo命令从标准输入中获得&#xff0c;read为bash内置命令。 [rootvm1 ~]# type echo echo is a shell builtin常用参数&#xff1a; -p prompt&#xff1a;设置提示信息&#xff0c;我们看help内容的信息&…

学习笔记|百度文心千帆大模型平台测试及页面交互简易代码

目前百度文心一言的内测资格申请相当拉胯&#xff0c;提交申请快3个月&#xff0c;无任何音讯。不知道要等到什么时候。 百度适时开放了百度文心千帆大模型平台&#xff0c;目前可以提交申请测试&#xff0c;貌似通过的很快&#xff0c;已取得测试申请资格&#xff0c;可以用起…

产品经理如何平衡用户体验与商业价值?

近期负责前端产品设计工作的小李忍不住抱怨&#xff1a;公司总是要求客户第一&#xff0c;实现客户良好体验&#xff0c;但在实际操作过程中&#xff0c;面向用户 体验提升的需求&#xff0c;研发资源计划几乎很难排上&#xff0c;资源都放在公司根据业务价值排序的需求…

MySQL笔记——表的分组查询、表的分页查询、表的约束、数据库设计

系列文章目录 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库&#xff0c;对MySQL数据库的简单操作&#xff0c;MySQL的外接应用程序使用说明 MySQL笔记——表的修改查询相关的命令操作 MySQL案例——多表查询以及嵌套查询​​​​​​ MySQL笔记——数据库当…

室外高精度人员定位系统解决方案:实现安全与效率的完美平衡

在如今高度竞争的商业环境中&#xff0c;室外高精度人员定位系统已成为许多行业提高安全性和效率的关键工具。 对此&#xff0c;华安联大推出室外高精度人员定位系统解决方案&#xff0c;该方案通过融合多种定位技术和优化算法&#xff0c;实现高精度定位&#xff0c;并通过真…

【Docker】Docker容器与虚拟机的对比、三要素、架构和镜像加速器的详细讲解

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

亚马逊建议卖家使用“客户评论”选项卡提高产品评级!

亚马逊美国站发布公告称客户评论见解选项卡通过分析评论来帮助卖家推出评价较高的产品&#xff0c;以更好地了解客户偏好和当前趋势&#xff0c;从而提高产品评级&#xff0c;以下是公告内容&#xff1a; 客户评论见解选项卡通过分析评论来帮助卖家推出评价较高的产品&#xf…

一份百万收藏的《从零开始写分布式服务框架》称霸Github榜首!

前言 架构说简单点就是一堆技术、框架、工具的组合&#xff0c;至于怎么组合&#xff0c;这就非常考验架构师的经验和水平。一个优秀的架构&#xff0c;可以让开发效率变得更加高效&#xff0c;为企业节省更多的成本。程序员可将自己更多的精力放在业务需求的实现上&#xff0…

Redis 集群部署

Redis 3.0 版本后正式推出 Redis 集群模式,该模式是 Redis 的分布式的解决方案,是一个提供在多个 Redis 节点间共享数据的程序集,且 Redis 集群是去中心化的,它的每个 Master 节点都可以进行读写数据,每个节点都拥有平等的关系,每个节点都保持各自的数据和整个集群的状态…

基于YOLOv8开发构建蝴蝶目标检测识别系统

在前面的一篇博文中已经很详细地描述了如何基于YOLOv8开发构建自己的个性化目标检测模型&#xff0c;感兴趣的话可以看下&#xff1a; 《基于YOLOv8开发构建目标检测模型超详细教程【以焊缝质量检测数据场景为例】》 本文的主要目的就是基于YOLOv8来开发构建细粒度的蝴蝶目标…

【高压架构】AP5199S LED平均电流型恒流驱动IC 0.01调光 景观舞台汽车灯驱动照明

说明 AP5199S 是一款外围电路简单的多功能平均电流型 LED 恒流驱动器&#xff0c;适用于宽电压范围的非隔离式大功率恒流 LED 驱动领域。芯片 PWM 端口支持超小占空比的 PWM 调光&#xff0c;可响应 60ns 脉宽。为客户提供解决方案&#xff0c;限度地发挥灯具优势&#xff0c;…

Betaflight飞控之FAILSAFE机制

Betaflight飞控之FAILSAFE机制 1. 源由2. 设计2.1 触发方式2.1.1 遥控开关触发2.1.2 遥控信号丢失 2.2 FAILSAFE策略2.2.1 Drop mode2.2.2 Landing mode2.2.3 GPS Return mode 3. GPS救援状态机4. 总结5. 参考资料 1. 源由 之前对航模飞控之FAILSAFE机制做了一个简单的探讨&am…

【JavaEE初阶】——第七节.Servlet入门学习笔记

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;JavaEE进阶 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录 前…

基于 moleculer 微服务架构的智能低代码PaaS 平台源码 可视化开发

低代码开发平台源码 低代码管理系统PaaS 平台 无需代码或通过少量代码就可以快速生成应用程序的开发平台。 本套低代码管理后台可以支持多种企业应用场景&#xff0c;包括但不限于CRM、ERP、OA、BI、IoT、大数据等。无论是传统企业还是新兴企业&#xff0c;都可以使用管理后台…

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…