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

目录

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.02system.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 <- 5h()....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 <- 5x1 <- xh(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.rhkb.cn/news/82135.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel整合Spring Cloud Gateway、Zuul详解

Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块&#xff0c;此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑&#xff1a; GatewayFlowRule&#xff1a;网关限流规则…

Python AI 绘画

Python AI 绘画 本文我们将为大家介绍如何基于一些开源的库来搭建一套自己的 AI 作图工具。 需要使用的开源库为 Stable Diffusion web UI&#xff0c;它是基于 Gradio 库的 Stable Diffusion 浏览器界面 Stable Diffusion web UI GitHub 地址&#xff1a;GitHub - AUTOMATI…

棒球电影产业建设·野球1号位

棒球电影产业建设 1. 引言 棒球电影产业在美国和全球的历史发展概述 自20世纪初&#xff0c;棒球电影产业在美国开始起步&#xff0c;以一种富有创意的方式将体育和娱乐结合起来&#xff0c;开创了一种全新的娱乐形式。这些电影为观众提供了一个了解棒球运动的独特视角&#…

力扣279.完全平方数(动态规划)

class Solution { public:int numSquares(int n) {vector<int> f(n 1);for (int i 1; i < n; i) {int minn INT_MAX;for (int j 1; j * j < i; j) {minn min(minn, f[i - j * j]); //上一次的 & 当前数可以找到一个新的更大的平方}f[i] minn 1; }…

Godot4 C# vscode开发环境搭建

用vscode搭建Godot4 C# 开发环境搭建 软件Godot配置vscode配置结果参考 软件 Godot .Net版本: 下载链接vscode :自行下载.netcore7&#xff1a;.netcore6可能也行vscode插件&#xff1a; Godot配置 1.配置文件用VSCode打开 2.生成C#项目 项目–>工具–>C#->Creat…

WPF实战项目十一(API篇):待办事项功能api接口

1、新建ToDoController.cs继承基础控制器BaseApiController&#xff0c;但是一般业务代码不写在控制器内&#xff0c;业务代码写在Service&#xff0c;先新建统一返回值格式ApiResponse.cs&#xff1a; public class ApiResponse{public ApiResponse(bool status, string mess…

【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(中)

你可以使用 Jersey 和 CXF 这些来写一个 Rest 或 SOAP 服务的java客服端。 你也可以直接使用 Apache HttpClient 来实现。但是 Feign 的目的是尽量的减少资源和代码来实现和 HTTP API 的连接。 *通过自定义的编码解码器以及错误处理&#xff0c;你可以编写任何基于文本的 HTT…

python数据分析 期末测验,python数据分析基础题库

大家好&#xff0c;小编为大家解答python数据分析选择题题目的问题。很多人还不知道python数据分析题目和答案&#xff0c;现在让我们一起来看看吧&#xff01; 自测试卷 5 一、选择题 1 &#xff0e;下面关于 RFM 模型说法正确的是&#xff08; &#xff09;。 A &#xff0e;…

现代C++中的从头开始深度学习【2/8】:张量编程

一、说明 初学者文本&#xff1a;此文本需要入门级编程背景和对机器学习的基本了解。张量是在深度学习算法中表示数据的主要方式。它们广泛用于在算法执行期间实现输入、输出、参数和内部状态。 在这个故事中&#xff0c;我们将学习如何使用特征张量 API 来开发我们的C算法。具…

gradle 命令行单元测试执行问题

文章目录 问题&#xff1a;命令行 执行失败最终解决方案&#xff08;1&#xff09;ADB命令&#xff08;2&#xff09;Java 环境配置 问题&#xff1a;命令行 执行失败 命令行 执行测试命令 无法使用&#xff08;之前还能用的。没有任何改动&#xff0c;又不能用了&#xff09; …

Learning Rich Features for Image Manipulation Detection阅读笔记

文章目录 Abstract3.3. 双线性池 Abstract 图像篡改检测与传统的语义目标检测&#xff08;semantic object detection&#xff09;不同&#xff0c;因为它更关注篡改伪影&#xff08;tampering artifacts&#xff09;而不是图像内容&#xff0c;这表明需要学习更丰富的特征。我…

微服务架构基础--第3章Spring Boot核心功能讲解

第3章Spring Boot核心功能讲解 一.预习笔记 1.使用maven创建SpringBoot项目 1-1:创建一个maven项目 1-2:在pom文件中导入依赖 1-3&#xff1a;编写启动类&#xff08;注意启动类的位置&#xff09; 1-4&#xff1a;编写测试类 1-5&#xff1a;运行SpringBoot启动类 2.了解p…

JPA实现存储实体类型信息

本文已收录于专栏 《Java》 目录 背景介绍概念说明DiscriminatorValue 注解&#xff1a;DiscriminatorColumn 注解&#xff1a;Inheritance(strategy InheritanceType.SINGLE_TABLE) 注解&#xff1a; 实现方式父类子类执行效果 总结提升 背景介绍 在我们项目开发的过程中经常…

大模型AI人才培养研习会,上海、武汉站同期招募!

伴随预训练大语言模型技术引发的产业变革&#xff0c;市场对AI人才需求也同样发生着深刻变化&#xff0c;教育迎来了新的机遇与挑战。由中国自动化学会主办&#xff0c;百度公司联合知名高校承办的大模型AI人才培养研习会&#xff0c;首场将于8月19日在武汉、上海双城同期举办&…

flutter-GridView使用

先看效果 代码实现 import package:app/common/util/k_log_util.dart; import package:app/gen/assets.gen.dart; import package:app/pages/widget/top_appbar.dart; import package:flutter/cupertino.dart; import package:flutter/material.dart; import package:flutter_…

iOS 实现图片高斯模糊效果

效果图 用到了 UIVisualEffectView 实现代码 - (UIVisualEffectView *)bgEffectView{if(!_bgEffectView){UIBlurEffect *blur [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];_bgEffectView [[UIVisualEffectView alloc] initWithEffect:blur];}return _bgEffect…

吃瓜教程-Task05

目录 支持向量机 间隔与支持向量 SVM基本型 对偶问题 kkt条件 例子 对偶问题 例子 对偶问题原理解释 软间隔与正则化 替代损失函数 支持向量回归 例子 支持向量机 间隔与支持向量 在样本空间中&#xff0c;划分超平面可通过如下线性方程来描述: 样本空间中任意点x到…

在软件测试中,如何有效地跟踪和管理缺陷?

在软件测试中&#xff0c;跟踪和管理缺陷是非常重要的&#xff0c;因为这有助于确保所有问题得到妥善处理&#xff0c;避免在产品发布后出现问题。以下是跟踪和管理缺陷的一些有效方法&#xff1a; 1.创建缺陷报告&#xff1a;当发现一个缺陷时&#xff0c;应该立即创建一个缺…

无涯教程-Perl - binmode函数

描述 此函数设置在区分两者的操作系统上以二进制形式读取和写入FILEHANDLE的格式。非二进制文件的CR LF序列在输入时转换为LF,在LF时在输出时转换为CR LF。这对于使用两个字符分隔文本文件中的行的操作系统(MS-DOS)至关重要,但对使用单个字符的操作系统(Unix,Mac OS,QNX)没有影…

《合成孔径雷达成像算法与实现》Figure3.4

代码对补零信号与未补零信号都进行了实现&#xff0c;补零信号更加贴近书中图3.4的样子&#xff1a; clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间 alpha_os [1.4,1.2,1.0,0…