R-并行计算

本文介绍在计算机多核上通过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ý]

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

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

相关文章

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作&#xff1a; 卷积&#xff08;Convolution&#xff09;:1x1卷积&#xff0c;3x3卷积&#xff0c;5x5及更高的卷积 批归一化&#xff08;Batch Normalization&#xff09; 激活&#xff08;Activate&#xff09; 池化&…

Meta-Transformer 多模态学习的统一框架

Meta-Transformer是一个用于多模态学习的新框架&#xff0c;用来处理和关联来自多种模态的信息&#xff0c;如自然语言、图像、点云、音频、视频、时间序列和表格数据&#xff0c;虽然各种数据之间存在固有的差距&#xff0c;但是Meta-Transformer利用冻结编码器从共享标记空间…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

音视频——封装格式原理

视频解码基础 一、封裝格式 ​ 我们播放的视频文件一般都是用一种封装格式封装起来的&#xff0c;封装格式的作用是什么呢&#xff1f;一般视频文件里不光有视频&#xff0c;还有音频&#xff0c;封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#xff0…

【C语言day07】

在调用函数的时候&#xff0c;真实传递给函数的是实参&#xff0c;函数定义部分函数名后的参数是形参。 形参和实参的名字是可以相同的&#xff0c;在函数调用的时候&#xff0c;形参是实参的一份临时拷贝&#xff0c;分别占用不同的内存空间&#xff0c;所以A正确&#xff0c;…

使用CRM分析数据有哪些功能?

CRM数据分析软件可以帮助企业增强竞争力&#xff0c;并更好地了解客户需求及市场变化&#xff0c;助力企业数据分析&#xff0c;并提供实时更新的数据和分析结果&#xff0c;CRM数据分析软件的主要特点是什么&#xff1f;包括以下6个特点。 CRM数据分析软件的主要功能通常包括…

SpringBoot入门

目录 一、创建项目 二、项目结构 三、起步依赖 四、简单请求接口 控制类 1、无参数 2、简单参数 3、实体参数 4、数组集合参数 5、json参数 五、统一响应结果 result.java HelloResponse.java 测试结果 一、创建项目 Spring官方骨架&#xff0c;可以理解为Sprin…

home-assistant整合sso

其他软件都可以通过nginx直接做代理添加鉴权&#xff0c;但是这个hass果然是用户安全隐私很强&#xff0c;做代理需要配置白名单&#xff0c;而且支持的三方鉴权都不太适合我的需求&#xff0c;非要改源码才行&#xff0c;后来我发现不用改源码的折中方式 参考文章 External …

通过两种实现方式理解CANoe TC8 demo是如何判断接收的以太网报文里的字段的

假设有一个测试用例,需求是:编写一个测试用例,发送一条icmpv4 echo request报文给DUT,identifier字段设置为10。判断DUT能够回复icmpv4 echo reply报文,且identifier字段值为10。 实现:在canoe的simulation setup界面插入一个test节点,ip地址为:192.168.0.1,mac地址为…

33. 本地记事本

本地记事本 html部分 <button class"add"><i class"iconfont icon-jiahao"></i> </button>css部分 *{margin: 0;padding: 0; } body{background-color: #7bdaf3;display: flex;padding-top: 3rem;flex-wrap: wrap; } .add{pos…

基于springboot+mybatis +mysql+jsp图书管理系统

基于springbootmybatis mysqljsp图书管理系统 一、系统介绍二、功能展示1.用户登陆2.用户注册3.图书借阅(学生)4.我的借阅&#xff08;学生&#xff09;5.图书管理&#xff08;管理员&#xff09;6.用户管理&#xff08;管理员&#xff09;7.借阅信息&#xff08;管理员&#x…

如何在电脑上查看连接过的wifi信息?

忘记wifi密码&#xff1f;想要看看wifi信息&#xff1f; 我想这篇文章可以帮到你O(∩_∩)O哈哈~。 通过网络连接中心查看 电脑上找到“网络和共享中心” 点击连接的wifi名称 点击无线属性 在安全选项中就有密码 通过电脑命令行工具查看推荐 通过winr快捷键打开电脑运…

前端 | ( 十三)CSS3简介及基本语法(下)| 伸缩盒模型 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 系列笔记&#xff1a; 【HTML4】&#xff08;一&#xff09;前端简介【HTML4】&#xff08;二&#xff09;各种各样的常用标签【HTML4】&#xff08;三&#xff09;表单及HTML4收尾…

MyBatis-Plus 查询PostgreSQL数据库jsonb类型保持原格式

文章目录 前言数据库问题背景后端返回实体对象前端 实现后端返回List<Map<String, Object>>前端 前言 在这篇文章&#xff0c;我们保存了数据库的jsonb类型&#xff1a;MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询 这篇文章介绍了模糊查询json/json…

【C#】.Net Framework框架使用JWT

2023年&#xff0c;第31周&#xff0c;第2篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 本篇文章主要简单讲讲&#xff0c;.Net Framework框架下使用JWT的代码例子&#xff0c;以及他们的基本概念。 2002年微软发布了.net framewo…

ArcGIS Engine 与 Visual Studio版本对照表

通过C#对于Arcgis的二次开发&#xff0c;需要Visual Studio版本需要与ArcGIS Engine对应&#xff0c;Visual Studio版本的或高或低都不能使ArcObjects SDK for microsoft.Net framework安装成功。下面是各个版本的对照表。 序号ArcEngine版本visual Studio版本Network版本110.…

十九章:利用跨图像语义挖掘进行弱监督语义分割

0.摘要 本文研究了仅使用图像级别监督进行语义分割学习的问题。目前流行的解决方案利用分类器的对象定位图作为监督信号&#xff0c;并努力使定位图捕捉更完整的对象内容。与之前主要关注于图像内部信息的努力不同&#xff0c;我们着眼于跨图像语义关系在全面对象模式挖掘中的价…

【Ansible】

目录 一、Ansible简介二、ansible 环境安装部署1、管理端安装 ansible 三、ansible 命令行模块&#xff08;重点&#xff09;1&#xff0e;command 模块2&#xff0e;shell 模块3、cron 模块4&#xff0e;user 模块5&#xff0e;group 模块6&#xff0e;copy 模块&#xff08;重…

在 3ds Max 和 After Effects 中创建逼真的蜘蛛网模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建蜘蛛网 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 转到创建>标准基元>平面并创建一个平面 在前视图中。 创建平面 步骤 3 保持其长度和宽度 segs 为 80。 段 步骤 4 打开修改器列表…

借助 Mybatis 的动态 SQL 解决传参不确定问题

在上一篇的&#xff1a;Mybatis 操作数据库的基本 CRUD 以及查询操作详析_糊糊涂涂的博客-CSDN博客中介绍了Mybatis使用固定SQL语句操作数据&#xff0c;本篇介绍 Mybatis 一个强大的特性&#xff1a;动态SQL。 动态 SQL 解决什么问题&#xff1f; 那当我们要执行的业务逻辑有…