iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >R语言如何通过parallel包实现多线程运行方式
  • 487
分享到

R语言如何通过parallel包实现多线程运行方式

2023-06-14 18:06:05 487人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关R语言如何通过parallel包实现多线程运行方式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由

这篇文章将为大家详细讲解有关R语言如何通过parallel包实现多线程运行方式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

什么是R语言

R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具

总的来说,R的运算速度不算快,不过类似并行运算之类的改进可以提高运算的性能。下面非常简要地介绍如何利用R语言进行并行运算

library(parallel)cl.cores <- detectCores()cl <- makeCluster(cl.cores)

detectCores( )检查当前电脑可用核数。

makeCluster(cl.cores)使用刚才检测的核并行运算。R-Doc里这样描述makeCluster函数:Creates a set of copies of R running in parallel and communicating over Sockets. 即同时创建数个R进行并行运算。

在该函数执行后就已经开始并行运算了,电脑可能会变卡一点。尤其在执行par开头的函数时。

在并行运算环境下,常用的一些计算方法如下:

1. clusterEvalQ(cl,expr)函数利用创建的cl执行expr

这里利用刚才创建的cl核并行运算expr。expr是执行命令的语句,不过如果命令太长的话,一般写到文件里比较好。比如把想执行的命令放在Rcode.r里:

clusterEvalQ(cl,source(file="Rcode.r"))

2.par开头的apply函数族

这族函数和apply的用法基本一样,不过要多加一个参数cl。一般如果cl创建如上面cl <- makeCluster(cl.cores)的话,这个参数可以直接用作parApply(cl=cl,…)。

当然Apply也可以是Sapply,Lapply等等。注意par后面的第一个字母是要大写的,而一般的apply函数族第一个字母不大写。另外要注意,即使构建了并行运算的核,不使用parApply()函数,而使用apply()函数的话,则仍然没有实现并行运算。

换句话说,makeCluster只是创建了待用的核,而不是并行运算的环境。

最后,终止并行运算只需要一行命令

stopCluster(cl)

案例1

不使用并行计算,直接使用lapply(隐式循环函数,它实际就是对不同的数据应用了相同的函数):

fun <- function(x){return (x+1);}system.time({res <- lapply(1:5000000, fun);});user  system elapsed21.42    1.74   25.70

案例2

使用parallel包来加速

library(parallel)#打开四核,具体核数根据机器的核数决定cl <- makeCluster(getOption("cl.cores", 4));system.time({res <- parLapply(cl, 1:5000000,  fun)});user system elapsed6.54 0.34 19.95#关闭并行计算stopCluster(cl);

看看单核机器跑出来的结果:

user  system elapsed29.30    9.23   97.22

所以,并非核数越多越好,看机器配置。

这个函数有两点要注意:

首先要先用detectCores函数确定系统核心数目,对于Window系统下的Intel I5或I7 处理器,一般使用detectCores(logical = F)来获得实际的物理核心数量。

由于这个函数使用的是调用Rscript的方式,这个例子里,对象被复制了三份,因此内存会吃的很厉害,在大数据条件就要小心使用。

案例3

linux下使用mclapply函数的效果如下:

mc <- getOption("mc.cores", 3)system.time({res <- mclapply(1:5000000, fun, mc.cores = mc);});user system elapsed6.657 0.500 7.181 stopCluster(cl);

补充:R语言如何并行处理[parallel package][向量化操作并行优化]

使用数据,长下面这样:

R语言如何通过parallel包实现多线程运行方式

方法:

使用parallel包,并行向量化处理,进一步提升原先向量化处理速度。

原始代码:

start <- Sys.time()experiment_step1 <- apply(dtc_small_modify, 1, decompose)end <- Sys.time()print(end-start)

原始运行时间:3.083114 分

R语言如何通过parallel包实现多线程运行方式

使用parallel包后

library(parallel) #并行处理包cl.cores <- detectCores(logical = F) #计算电脑核心数cl <- makeCluster(cl.cores) # 初始化要使用的核心数start <- Sys.time()results <- parApply(cl=cl, dtc_small_modify, 1, decompose) # apply的并行版本stopCluster(cl) # 关闭并行模式end <- Sys.time()print(end-start)

并行后

运行时间:55.5877 秒,相较原先,速度提升了将近四倍!

R语言如何通过parallel包实现多线程运行方式

Tips:上述是对向量化(Vectorization)apply类的并行处理。对于apply的并行处理,必须使用par开头的对应apply.

列表如下:

parLapply(cl = NULL, X, fun, …, chunk.size = NULL) parSapply(cl = NULL, X, FUN, …, simplify = TRUE, USE.NAMES = TRUE, chunk.size = NULL) parApply(cl = NULL, X, MARGIN, FUN, …, chunk.size = NULL) parRapply(cl = NULL, x, FUN, …, chunk.size = NULL) parCapply(cl = NULL, x, FUN, …, chunk.size = NULL) parLapplyLB(cl = NULL, X, fun, …, chunk.size = NULL) parSapplyLB(cl = NULL, X, FUN, …, simplify = TRUE, USE.NAMES = TRUE, chunk.size = NULL)

使用apply类向量化操作后,常常产生大规模列表,可能需要将列表转成一个完整的大数据框。

关于“R语言如何通过parallel包实现多线程运行方式”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: R语言如何通过parallel包实现多线程运行方式

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

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

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

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

下载Word文档
猜你喜欢
  • R语言通过parallel包实现多线程运行方式
    总的来说,R的运算速度不算快,不过类似并行运算之类的改进可以提高运算的性能。下面非常简要地介绍如何利用R语言进行并行运算 library(parallel) cl.cores &...
    99+
    2024-04-02
  • R语言如何通过parallel包实现多线程运行方式
    这篇文章将为大家详细讲解有关R语言如何通过parallel包实现多线程运行方式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由...
    99+
    2023-06-14
  • R语言 实现多行注释的方式
    R语言本身并没有类似C/ C++/ JAVA这些语言一样提供 像 一样的多行注释,但我们也有其他方法可以达到这种方法。 一. if语句 我们可以通过一个if语句,里面添加一个永为假...
    99+
    2024-04-02
  • R语言如何实现多元线性回归
    R小白几天的摸索 红色为输入,蓝色为输出 输入数据 先把数据用excel保存为csv格式放在”我的文档”文件夹 打开R软件,不用新建,直接写 回归计算 求三个平方和 置信区间...
    99+
    2024-04-02
  • 如何使用Go语言实现多线程Websocket通信
    在近年来,实时通信已经成为了一种基本的需要。WebSocket则更是实时通信当中的佼佼者,它能够更快速、有效地实现客户端和服务器端之间的实时通信。而Go语言也作为近年来较火热的一种语言,被广泛应用于实时通信中。利用Go语言的优点以及多线程处...
    99+
    2023-12-14
    多线程 Go语言 Websocket通信
  • JavaScript如何实现多线程运行库Nexus.js
    这篇文章主要为大家展示了“JavaScript如何实现多线程运行库Nexus.js”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何实现多线...
    99+
    2024-04-02
  • R语言如何实现检验多重共线性的操作
    小编给大家分享一下R语言如何实现检验多重共线性的操作,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!函数kappa()df<-data.frame()df_cor=cor(df)kappa(df_cor, e...
    99+
    2023-06-14
  • 如何在R语言项目中实现多元线性回归
    这期内容当中小编将会给大家带来有关如何在R语言项目中实现多元线性回归,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。输入数据先把数据用excel保存为csv格式放在”我的文档”文件夹打开R软件,不用新建,直...
    99+
    2023-06-08
  • R语言多元线性回归是什么及如何实现
    这篇文章主要介绍“R语言多元线性回归是什么及如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“R语言多元线性回归是什么及如何实现”文章能帮助大家解决问题。一、模型简介一元线性回归是一个主要影响因...
    99+
    2023-07-02
  • 如何通过实现ThreadFactory来对线程进行命名
    这篇文章主要介绍如何通过实现ThreadFactory来对线程进行命名,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文记录@Async的基本使用以及通过实现ThreadFactory来实现对线程的命名。@Async...
    99+
    2023-06-15
  • Spring并发编程:如何使用Java语言实现多线程响应?
    随着计算机技术的不断发展,多核CPU已经成为了现代计算机的标配。针对多核CPU的并发编程已经成为了开发人员不可回避的问题。在Java语言中,提供了多线程机制来支持并发编程。本文将为大家介绍如何使用Java语言实现多线程响应。 一、基本概念...
    99+
    2023-11-06
    响应 并发 spring
  • spring Boot应用如何通过Docker来实现构建、运行、发布流程
    小编给大家分享一下spring Boot应用如何通过Docker来实现构建、运行、发布流程,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. Docker 简介Docker 是一个开源的应用容器引擎,让开发者可以打包他们的...
    99+
    2023-05-30
    spring boot docker
  • GO语言学习笔记:如何在打包过程中实现并发编程?
    GO语言是一种基于C语言的静态类型编程语言,它具有高并发、高效、易用等特点,适合用于开发网络应用、分布式系统、云计算等领域。在GO语言中,实现并发编程是其最大的特点之一。在本篇文章中,我们将学习如何在GO语言中实现并发编程。 GO语言中的...
    99+
    2023-07-01
    打包 并发 学习笔记
  • 如何在Go语言中通过使用容器框架实现异步编程?
    Go语言是一种现代化的编程语言,它在服务器端编程、网络编程、分布式系统和云计算中都有着广泛的应用。在Go语言中实现异步编程是非常重要的,因为它可以提高程序的性能和响应能力。 本文将会介绍如何在Go语言中通过使用容器框架实现异步编程,同时会穿...
    99+
    2023-10-30
    容器 框架 异步编程
  • 如何在容器中运行GO语言程序,实现文件处理操作?
    在现代软件开发中,容器技术已经成为了一个不可或缺的组成部分。容器可以帮助开发人员将应用程序与其依赖项打包到一个单独的可移植容器中,从而加快应用程序的部署和管理。而在容器中运行Go语言程序也是一种流行的方式。在本文中,我们将介绍如何在容器中运...
    99+
    2023-08-03
    http 容器 文件
  • UNIX系统中的异步编程:如何通过GO语言的LOAD命令实现?
    在现代计算机系统中,异步编程已经成为了一种常见的编程模式。在UNIX系统中,异步编程是一种非常常见的编程技巧。同时,GO语言也成为了一种非常流行的编程语言,因为它支持异步编程。在本文中,我们将会介绍如何通过GO语言的LOAD命令来实现UN...
    99+
    2023-10-26
    load 异步编程 unix
  • Java 实现实时自然语言处理的打包方式对程序性能有何影响?
    自然语言处理(Natural Language Processing,NLP)是人工智能领域的一个重要分支,它的目标是让计算机能够理解、处理和生成自然语言,使得计算机能够像人类一样有效地处理自然语言,从而为人类提供更好的服务。在实时自然语...
    99+
    2023-10-02
    实时 自然语言处理 打包
  • UNIX同步API在Go语言中的应用:如何实现多线程数据同步?
    Go语言是一种高效、简洁、并发的编程语言,它的并发性质使得它在处理多线程数据同步方面非常出色。而UNIX同步API则是一种用于实现多线程数据同步的标准API,其被广泛应用于UNIX和类UNIX操作系统中。在本文中,我们将探讨如何在Go语言...
    99+
    2023-09-30
    unix 同步 api
  • 文件API的Go语言实现:如何通过并发编程实现文件处理的高并发性?
    Go语言是一门支持高并发编程的语言,它的并发机制非常强大,可以让我们在处理文件时获得更高的并发性能。在本文中,我们将介绍如何使用Go语言的文件API实现高并发的文件处理。 并发的文件读写 在处理大量文件时,我们需要使用并发的方式来读写...
    99+
    2023-11-02
    并发 文件 api
  • 如何用Go语言实现实时分布式计算,同时使用Numpy进行高性能数学运算?
    在现代计算机应用程序中,实时分布式计算和高性能数学运算是非常重要的。Go语言是一种非常流行的编程语言,由于其并发性和简单性,已经成为了云计算和分布式系统的首选语言之一。而Numpy则是一个Python库,它提供了高性能的数学计算和数据分析...
    99+
    2023-09-10
    分布式 numpy 实时
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作