R语言常用两种并行方法之parallel详解_第1页
R语言常用两种并行方法之parallel详解_第2页
R语言常用两种并行方法之parallel详解_第3页
R语言常用两种并行方法之parallel详解_第4页
R语言常用两种并行方法之parallel详解_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第R语言常用两种并行方法之parallel详解目录并行计算在模拟时什么地方可以用到并行?怎么在R中看我们可以使用并行?parallel(简单)由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallel与snowfall,这两种方法各有优缺,但还是推荐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-togoparallelinR–basics+tips)

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

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

输出结果为:

[[1]]

[1]111

[[2]]

[1]248

[[3]]

[1]3927

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

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]111

[[2]]

[1]248

[[3]]

[1]3927

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

stopCluster(cl)

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

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

Errorinunserialize(node$con):errorreadingfromconnection

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

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

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

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

maxcores=memory.limit()/memory.size();

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

不过后面我们介绍另一种并行方式snowfall相对而

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论