iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >R语言常用两种并行方法之parallel详解
  • 527
分享到

R语言常用两种并行方法之parallel详解

2024-04-02 19:04:59 527人浏览 薄情痞子
摘要

目录并行计算在模拟时什么地方可以用到并行?怎么在R中看我们可以使用并行?parallel(简单)由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallel与snowfa

由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallelsnowfall,这两种方法各有优缺,但还是推荐snowfall,整体较为稳定,不容易因为内存不足或者并行线程过多等原因而报错。

并行计算

并行计算: 简单来讲,就是同时使用多个计算资源来解决一个计算问题,是提高计算机系统计算速度和处理能力的一种有效手段。(参考:并行计算简介)

  • 一个问题被分解成为一系列可以并发执行的离散部分;
  • 每个部分可以进一步被分解成为一系列离散指令;
  • 来自每个部分的指令可以在不同的处理器上被同时执行;
  • 需要一个总体的控制/协作机制来负责对不同部分的执行情况进行调度。

而在我们平时的模拟中,在一台电脑或者服务器上,就是将我们的计算任务分散到多个不同的小的核中同时进行处理。

在模拟时什么地方可以用到并行?

并行操作一般适用于重复的操作,比如重复随机按照相同分布生成数据,然后分别同时进行模拟。这里就可以用并行。亦或者我们要做permutation计算p-value等信息,也可以进行并行,因为这种操作是简单的重复即可完成。

但诸如迭代,递归算法就很难用并行实现,这种都叫串行。因为后一个的对象需要前一个对象的信息,只能先算完前一个,再计算后一个内容。

在进行实际的模拟比较多种方法的优劣时,通常需要重复实验成百上千次,一般可对这里进行并行操作,写在这里的操作是最简单的。但会有个缺点:可能会出现挂服务器跑了半天还没出现结果,但是自己又并不知道运行到哪了的现象。虽然有一些方法可以进行查看(例如snowfall中的sfCat()函数,但是输出的结果是相对来说比较凌乱的,而且有时还会输出不了,具体用法后面会进行介绍),但是还是可能等很久才出一些结果,如果并行某一个地方维度或者代码有些小瑕疵,整段结果都没法进行输出。

所以建议,如果能将并行写到每个算法中间的话,就尽量写到每个具体算法之中(如需要permutation的写到permutation中;如要多次for循环计算统计量以及其它信息的,直接替代for循环),这样后面实际操作时也比较方便。(这样做的缺点是可能导致内存占用过多,从而使并行出错)

怎么在R中看我们可以使用并行?

只需使用如下命令,就可以查看我们电脑能够使用的线程数:


detectCores()

理论上这个值 ≥2,我们电脑就可以进行并行操作(现在的电脑基本都是4往上的)。当然通常我们不会使用所有的线程来进行并行,不然。。。电脑很可能会崩。

言归正传,下面介绍两种R中常用的并行操作(默认会apply族相关操作)。

parallel(简单)

一个是parallel包,此包最大的优势就是非常的便捷,只需将我们原本的apply()修改为parApply()lapply()修改为parLapply()sapply()修改为我们常用的parSapply()等等,然后再在开头和结尾添加上相应的开始并行与结束并行的语句即可。

下面举个栗子(参考:How-to Go parallel in R – basics + tips)

首先我们使用lapply()进行下述操作向量化操作:


lapply(1:3, function(x) c(x, x ^ 2, x ^ 3))

输出结果为:

[[1]]
[1] 1 1 1

[[2]]
[1] 2 4 8

[[3]]
[1]  3  9 27

我们将其修改为并行方法,首先是初始化我们的并行:


library(parallel) # 载入parallel包

# 计算可用线程数,并设置并行使用线程数
no_cores <- detectCores() - 1

# 初始化
cl <- makeCluster(no_cores)

然后修改原本我们lapply()的命令:


parLapply(cl, 1:3, function(x) c(x, x ^ 2, x ^ 3))

注意:这里与一般的lapply()相比,要加上cl。

输出结果为:

[[1]]
[1] 1 1 1

[[2]]
[1] 2 4 8

[[3]]
[1]  3  9 27

到这里我们还没完,前面初始化我们的并行,这里需要结束我们的并行,释放我们用到的线程与内存,返还给系统。具体使用如下语句:


stopCluster(cl)

至此,一个简单的并行就完成了。

但事情远远没这么简单,在我们需要处理非常复杂的并行任务,反复使用parallel库中的并行方法时,我们没办法将我们的线程数开到最大,有时候甚至连一半都不行,它会出现下面所示的报错:

Error in unserialize(node$con) : error reading from connection

这种情况出现的原因就很复杂了,这是因为“调用核心数–计算机内存”的不匹配造成的。如果你的数据集很大,调用了很多核心,那么你的计算机内存如果不够匹配,就会出现连接不上的不错,甚至还出现卡机等现象。简言之就是爆内存了。

解决方法(不能说完全解决,只能说能有效缓解):

使用更少的线程进行并行;

如果你的电脑内存非常小,有一个简单的方法确定你的最大使用线程:

max cores = memory.limit() / memory.size();

将大量的并行分小部分进行;在代码中多使用rm()删除没用的变量,使用GC()回收内存空间;

不过后面我们介绍另一种并行方式snowfall相对而言就更加稳定了(虽然代码写起来会相对复杂一些),这个我们留待下一篇博客:R中两种常用并行方法snowfall 中进行详细介绍。

以上就是R语言常用两种并行方法之parallel详解的详细内容,更多关于R语言并行方法parallel的资料请关注编程网其它相关文章!

--结束END--

本文标题: R语言常用两种并行方法之parallel详解

本文链接: https://www.lsjlt.com/news/156666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • R语言常用两种并行方法之parallel详解
    目录并行计算在模拟时什么地方可以用到并行?怎么在R中看我们可以使用并行?parallel(简单)由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallel与snowfa...
    99+
    2024-04-02
  • R语言常用两种并行方法之snowfall详解
    上一篇博客(R中两种常用并行方法之parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定。很多时候我们将大量的...
    99+
    2024-04-02
  • R语言行筛选的方法之filter函数详解
    目录1. 数据2. 生成ID列和类型3. 提取effect大于0.1的行4. 提取加性效应,且effect小于0的行5. 根据部分行名删选6. 固定字符特征进行行筛选总结下面介绍一下...
    99+
    2024-04-02
  • R语言中怎么使用parallel包实现并行计算
    要在R语言中使用parallel包实现并行计算,首先要安装并加载parallel包。可以使用以下代码来安装和加载parallel包:...
    99+
    2024-04-03
    R语言 parallel
  • R语言中的五种常用统计分析方法
    1、分组分析aggregation 根据分组字段,将分析对象划分为不同的部分,以进行对比分析各组之间差异性的一种分析方法。 常用统计指标: 计数 length 求和 sum 平均值 ...
    99+
    2024-04-02
  • C语言中栈的两种实现方法详解
    目录一、顺序栈二、链式栈总结一、顺序栈 #include<stdio.h> #include<stdlib.h> #define maxsize 64 ...
    99+
    2024-04-02
  • r语言合并两个数据集的方法是什么
    在R语言中,合并两个数据集可以使用merge()函数或者dplyr包中的left_join()、right_join()、inner...
    99+
    2024-04-02
  • R语言读取excel数据的方法(两行命令)
    安装库 安装xlsx install.packages("xlsx") 使用 library(xlsx) ray = read.xlsx('D:/Code/R/Data i...
    99+
    2024-04-02
  • R语言的Dataframe常用操作方法
    这篇文章主要讲解了“R语言的Dataframe常用操作方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“R语言的Dataframe常用操作方法”吧!上节我们简单介绍了Dataframe的定义...
    99+
    2023-06-20
  • 详解R语言数据合并一行代码搞定
    数据的合并 需要的函数 cbind(),rbind(),bind_rows(),merge() 准备数据 我们先构造一组数据,以便下面的演示 > data1&...
    99+
    2024-04-02
  • R语言操作文件方法详解教程
    目录1. 文件与文件夹列表的读取2. 新建文件与文件夹3. 文件与文件夹的删除4. 查看文件与文件夹是否存在小练习由于最近在处理一些真实数据时涉及到嵌套的 .tar.gz 文件的解压...
    99+
    2024-04-02
  • R语言中ifelse、which、%in%的用法详解
    ifelse、which、%in%是R语言里极其重要的函数,以后会经常在别的程序中看到。 ifelse ifelse是if条件判断语句的简写,它的用法如下: ifelse(tes...
    99+
    2024-04-02
  • R语言函数详解及实例用法
    函数是一组组合在一起以执行特定任务的语句。 R 语言具有大量内置函数,用户可以创建自己的函数。 在R语言中,函数是一个对象,因此R语言解释器能够将控制传递给函数,以及函数完成动作所需...
    99+
    2024-04-02
  • R语言strsplit函数用法深入详解
    1、R语言strsplit用于分割字符串 创建测试数据 > test <- "aa bb cc dd ee ff" ##创建测试数据 > test [1] "a...
    99+
    2024-04-02
  • R语言作图之直方图histogram绘制过程详解
    先给大家介绍下R语言入门:直方图histogram的绘制,具体内容如下所示: 直方图和条形图最大的不同则是直方图可以用于显示出一个数据的频数,具有统计的作用,我们下面来看一一看直方图...
    99+
    2024-04-02
  • R语言列筛选的方法select实例详解
    目录前言1. 数据描述2. 使用R语言默认的方法:列选择3. tidyverse的rename函数4. tidyverse的select函数5. select函数注意事项5.1 绝对...
    99+
    2024-04-02
  • C语言之pragma用法详解
    (0)前言 C语言Pragma 指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma 指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或...
    99+
    2023-10-12
    c语言 java linux c++ 开发语言
  • 详解MySQL Shell 运行 SQL 的两种内置方法
    目录第一、函数run_sql 如何使用:第二、函数 sql 如何使用:结论:mysql Shell 是兼容 MySQL 传统命令行客户端的超级替代版,支持 SQL 、JavaScript 、python 三种语言环境。工...
    99+
    2024-04-02
  • 详解MySQL Shell 运行 SQL 的两种内置方法
    目录第一、函数run_sql 如何使用:第二、函数 sql 如何使用:结论:MySQL Shell 是兼容 MySQL 传统命令行客户端的超级替代版,支持 SQL 、JavaScri...
    99+
    2022-11-13
    MySQL Shell 运行 SQL 内置方法 MySQL Shell 运行 SQL
  • R语言安装R包的方法,mac、windows、linux安装R包常见问题与解决方法
    R语言如何快速安装R包? 如果把R比作是沃土的话,那么R包就是鲜花,开源共享的开发者社区提供了很多功能丰富的R包,方便使用者充分利用R语言完成工作。 但是,有时候在安装R包是会遇到各种各样的报错和问题...
    99+
    2023-09-21
    程序人生
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作