并行执行

Yes! Well done! Socket clusters are initialized without variables, so a_global_var wasn't found. Fork clusters take a copy of global variables, but changes made after the cluster is created are not copied to each node.

parallel包

> # A global variable and is defined
> a_global_var <- "before"
>
> # Create a fork cluster with 2 nodes
> cl_fork <- makeCluster(2, type = "FORK")
>
> # Change the global var to "after"
> a_global_var <- "after"
>
> # Evaluate the print fun on each node again
> clusterCall(cl_fork ,print_global_var)
[[1]]
[1] "before" [[2]]
[1] "before"
>
> # Stop the cluster
> stopCluster(cl_fork)
>

总的来说,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)

demo1 不使用并行计算,单纯的使用lapply函数

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

demo2 使用parallel进行并行计算

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

比较两个的结果,可以很明显的看出并行计算的效率更高

library(parallel);#加载并行计算包

cl <- makeCluster(8);# 初始化cpu集群

clusterEvalQ(cl,library(RODBC));#添加并行计算中用到的包

clusterExport(cl,'variablename');#添加并行计算中用到的环境变量(如当前上下文中定义的方法)

dt <- parApply(cl,stasList, 1, stasPowerPre_Time);# apply的并行版本

all_predata_time <- do.call('rbind',dt);# 整合结果

R parallel包实现多线程1的更多相关文章

  1. R parallel包学习笔记2

    这个部分我在datacamp上面学习笔记,可视化的性能很差,使用的函数也很少. 可以参考一下大佬的博客园个人感觉他们讲的真的很详细 https://cosx.org/2016/09/r-and-par ...

  2. R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)

    要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 终于开始攻克并行这一块了,有点小兴 ...

  3. 如何在windows中编写R程序包(转载)

    网上有不少R包的编译过程介绍,挑选了一篇比较详细的,做了稍许修改后转载至此,与大家分享 如何在windows中编写R程序包 created by helixcn modified by binaryf ...

  4. android工程gen目录中R.java包名是怎么确定

    新建一个工程,包名用的com.mythroad.adskiller, 后来觉得不好,又改成com.mythroad.adsinscepter,但是我发现gen下的R.java文件的包名还是原来的com ...

  5. R语言包相关命令

    R的包(package)通常有两种:1 binary package:这种包属于即得即用型(ready-to-use),但是依赖与平台,即Win和Linux平台下不同.2 Source package ...

  6. R语言包在linux上的安装等知识

    有关install.packages()函数的详见:R包 package 的安装(install.packages函数详解) R的包(package)通常有两种:1 binary package:这种 ...

  7. R语言 包

    R语言包 R语言的包是R函数,编译代码和样本数据的集合. 它们存储在R语言环境中名为"library"的目录下. 默认情况下,R语言在安装期间安装一组软件包. 随后添加更多包,当它 ...

  8. R语言并行运算示例 parallel 包

    library(parallel)#example 1cl <- makeCluster(getOption("cl.cores", 2))clusterApply(cl, ...

  9. R扩展包

    log10() .libPaths()#查看R包目录 library()#查看以前安装的函数 search() #安装R包的方式 install.packages("car")#安 ...

随机推荐

  1. Java语言与C++语言区别

    最近有点空闲时间,学习了Java语言.教材<Java简明教程>第四版,清华大学出版社.本人以前有C++基础,所以主要总结下两者区别. 一.基本类型和运算 1.布尔常量,true和false ...

  2. Java自学-Lambda 聚合操作

    java 集合的聚合操作 步骤 1 : 传统方式与聚合操作方式遍历数据 遍历数据的传统方式就是使用for循环,然后条件判断,最后打印出满足条件的数据 for (Hero h : heros) { if ...

  3. " ModuleNotFoundError: No module named 'tkinter' "的解决方法

    踩坑场景 在使用pillow这个包处理图片的时候,运行程序,报错ModuleNotFoundError: No module named 'tkinter',遇到ModuleNotFoundError ...

  4. vector内存分配简单介绍

    众所周知,vector的size()其实并不代表它占用的空间,它实际占用空间可以用capacity()查看 众所周知,push_back()时,如果size==capacity则会使capacity从 ...

  5. 洛谷题解 P1134 【阶乘问题】

    原题传送门 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600 12的阶乘最右边的非零位为6. ...

  6. PyQt5【入门-窗口】

    一.窗口 #设置窗口标题 setWindowTitle("标题") #设置窗口坐标和大小 setGeometry(0,0,800,600) """ 项 ...

  7. Object的对象的相关方法

    Object.getPrototypeOf() Object.getPrototypeOf方法返回参数对象的原型.这是获取原型对象的标准方法. var F = function () {}; var ...

  8. 剑指offer-面试题7-重建二叉树-二叉树

    /* 题目: 输入二叉树的前序遍历和中序遍历的结果,重建二叉树.假设输入的前序遍历和中序遍历的结果中不包含重复的数字. */ /* 思路: 使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树. ...

  9. Microsoft visual studio 2015已停止工作最全解决办法

    1.重装系统,不到万不得已不要选择...麻烦. 2.使用管理员权限运行VS,部分可能有效. 3.卸载重新安装vs,如果是一些配置问题或许能解决,还有要是卸载的干净可能有效. 4.据说可能是插件有问题造 ...

  10. 让bat文件自动以管理员身份运行

    · 让bat文件自动以管理员身份运行 如何让bat文件自动以管理员身份运行,将这段写在bat文件的前头即可 : %1 mshta vbscript:CreateObject("Shell.A ...