性能优化在R:并行计算和RCPP

2020年5月15日
通过R教程

[本文最初发表于R教程,并慷慨解囊,以188bet app]. (您可以在此页面上报告有关内容的问题金宝搏网址在这里
想在R-bloggers上分享你的内容吗?188bet app188bet app 如果你有博客,或者在这里如果你没有。

“并行”包

参考:
https://bookdown.org/rdpeng/rprogdatascience/parallel-computation.html

使用并行计算可以使R中的许多计算更快。通常,并行计算是在多个计算处理器或核心上同时执行不同的较大计算块。

平行的包可用于将任务(编码为函数调用)并行发送到计算机上的每个处理核心。

麦克拉普利()功能基本上是并行化的呼吁lapply()。前两个参数麦克拉普利()是因为它们是完全一样的lapply(). 然而,麦克拉普利()有更多的参数(必须命名),其中最重要的是mc.cores您可以使用指定的处理器数量参数/内核要分割整个计算。例如,如果你的机器上有4个内核,可以指定mc.核心=4个在4个内核上中断操作的并行化(尽管如果在后台运行除R之外的其他操作,这可能不是最好的主意)。

第一件事你可能想和平行的软件包是如果你的计算机实际上有多个核心,你可以利用。

要求(平行)芯< -探测器()核心
## [1] 8

麦克拉普利()功能(及相关mc公司*功能),通过在Unix风格的操作系统叉机制的工作原理。因为使用了叉机制中,mc公司*功能一般不提供给Windows操作系统的用户。

mclapply17有趣的=功能(X)返回(X),mc.cores =核心-1个
##在mclapply(1错误:7,FUN =函数(x)的回报(x)中,mc.cores =芯 - : 'mc.cores'> 1不支持Windows

使用您的计算机上的分叉机制是执行并行计算的一种方式,但不是唯一的方式,并行配套优惠。另一种方法是建立一个“集群”使用多个内核上你的电脑是通过插座

使用生成群集()功能。

CL < -makeCluster(核-1个

CL对象是整个集群的抽象,就是我们用来指示,我们想要做的并行计算的各种集群功能。

要做好lapply()通过套接字集群,我们可以使用操作parLapply()功能。

#示例函数测试< -功能(){Sys.sleep2返回真的}#并行调用“test”parLapplyCL =CL,17有趣=功能(X) {测试()})
##checkForRemoteErrors(val)中的错误:7个节点产生错误;第一个错误:找不到函数“test”

你会发现,不幸的是,有一个在运行此代码中的错误。其原因是,虽然我们已经装载硫酸数据到我们的研发会议上,数据不提供给已产生了由独立的子进程生成群集()功能。这些数据,和任何其他信息,子进程将需要执行代码,需要通过导出到子进程从父进程群集导出()功能。无需导出数据是行为“多核”的方针和“套接字”的方法之间的关键区别。

#出口“测试”群集节点集群导出(第1条,“测试”#并行调用“test”parLapplyCL =CL,17有趣=功能(X) {测试()})
##35;##[[5]###[[1]真#######[[6]]####[1]真

多久时间?

# 平行t0号<-加工时间()XX < -parLapplyCL =CL,17有趣=功能(X) {测试()})T1 < -加工时间()T1-T0
##用户系统经过## 0.00 0.00 2.03
#串口t0号<-加工时间()XX < -搭接17有趣的=功能(X) {测试()})T1 < -加工时间()T1-T0
##用户系统运行时间###0.00 0.00 14.19

集群评估()评估每个集群节点上的文字表达。它可以用于包加载到每个节点。

#加载动物园包中的每个节点clusterEvalQCL =CL,要求(动物园))
##35;##[[5]###[[1]真#######[[6]]####[1]真
#并行调用zoo函数parLapplyCL =CL,17有趣=功能(X) {is.zoo动物园())})
##35;##[[5]###[[1]真#######[[6]]####[1]真

一旦你与你的集群完成的工作,这是很好的清理和停止集群的子进程(戒烟R还将停止所有的子进程)。

STOPCLUSTER(中心线)

“Rcpp”包

参考:
http://heather.cs.ucdavis.edu/~matloff/158/RcppTutorial.pdf

RCPP包提供了C++类,极大地方便了使用R包中的C或C++代码接口。。呼叫()接口由R.提供它提供R上的顶部上的强大的API,允许富R对象(包括S3,S4或参考类对象)之间的直接交换
R和C++。

在它自己的源文件保持C ++代码提供了几个好处(推荐)。然而,它也可以做inline声明和C ++代码,这将在下面的示例中被使用执行。

让我们在FC++和C++中实现斐波那契序列:

\[F{n=F{n-1}+F{n-2}]
\(F_0 = 0 \)\(F_1 = 1 \)

FIBR < -功能(N){如果(n)==0返回0如果(n)==1返回1返回FIBR(n)-1个+FIBR(n)-2个))}
RCPP::cppFunctionINT FIBC(const int的N){如果(n==0)返回(0);如果(N == 1)返回(1);收益率(fibC(n-1)+fibC(n-2));}"

比较性能:

要求(微基准)微基准FIBR20集装袋20))
##单位:微秒###expr min lq平均中位数uq max neval##fib(20)8501.602 9666.352 11144.27108 10452.601 11692.950 20956.601 100##fibC(20)26.800 29.801 48.61603 38.251 43.801 986.201 100

发表评论对于作者,请按照自己的博客上的链接和评论:R教程

188bet appR-bloggers.com报价每日电子邮件更新金宝搏网址 [R新闻和教程金宝搏网址金宝搏网址 和许多其他议题。点击这里,如果你正在寻找张贴或找到一个R /数据科学工作
想在R-bloggers上分享你的内容吗?188bet app188bet app 如果你有博客,或者在这里如果你没有。



如果你走到这一步,为什么不订阅更新从网站?选择你的味道:电子邮件推特1188bet app, 要么脸谱网...

评论已关闭。

搜索R-博客188bet app

本周访问量最大的文章

  1. 赞助商

决不会错过的更新!
订阅R-bloggers188bet app接受
包含最新R文章的电子邮件。
(您将不会再看到此消息。)

单击此处关闭(此弹出窗口将不再显示)