服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - R语言 - R语言常用两种并行方法之snowfall详解

R语言常用两种并行方法之snowfall详解

2022-01-20 15:42Kanny广小隶 R语言

这篇文章主要为大家介绍了R语言常用两种并行方法之snowfall详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

上一篇博客(R中两种常用并行方法之parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定。很多时候我们将大量的计算任务挂到服务器上进行运行时,更看重的是其稳定性。

这时就要介绍R中的另一个并行利器——snowfall,这也是在平时做模拟时用的最多的一种方法。

针对上篇中的简单例子

首先是一个最简单的并行的例子,这个例子不需要载入任何依赖库、函数、对象等。相对也比较简单:

?
1
2
3
4
5
6
7
8
9
10
library(snowfall)  # 载入snowfall包
 
# 并行初始化
sfInit(parallel = TRUE, cpus = detectCores() - 1)
 
# 进行lapply的并行操作
sfLapply(1:3, function(x) c(x, x ^ 2, x ^ 3))
 
# 结束并行,返还内存等资源
sfStop()

语法基本也比较好理解,代码中的注释也有进行说明。sfLapply()的操作是与lapply()相对应的。类似地,还有sfSapply()sfApply()等函数,其用法与apply组中的函数一致。

snowfall进阶

在实际操作时,我们进行的函数往往没有这么简单,往往还需要依赖一些其它的函数、变量、R包等,这时就不能用上述的方法简单的进行操作了。

下面给出一个具体实际的操作案例,来展示如何载入函数中依赖的对象等参数。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
n <- 100
m <- 100
 
fun1 <- function(...) {
  ...
}
 
fun2 <- function(...) {
  ...
}
 
sfInit(parallel = TRUE, cpus = 10) #初始化
 
sfLibrary(MASS)     # 载入依赖R包MASS
sfLibrary(ggplot2)  # 载入依赖R包ggplot2
 
sfExport("n", "m")         # 载入依赖的对象
sfExport("fun1", "fun2")   # 载入依赖的函数
 
# 并行计算
result <- sfLapply(1:10000, myfun)
# 注意:myfun是自己定义的函数,里面需要用到包MASS, ggplot2;变量m, n;函数fun1, fun2。
 
sfStop() # 结束并行

其实很简单,对于并行函数依赖的库,就是sfLibrary()进行载入,所以来的对象以及函数则使用sfExport()进行载入。

当函数或者对象非常多时,不方便一个一个单独输入,这时我们可将所有的对象与函数存到allfun.R文件夹中,然后再采用sfSource('allfun.R')将所有的对象与函数进行导入,方便快捷。

下面我们再来看看如何查看并行进度:

使用sfCat查看并行进度

这部分参考:How to output a message in snowfall?

我们只需在函数中添加sfCat()函数,即可查看并行进度,其示例代码如下所示:

?
1
2
3
4
5
6
7
8
sfInit(parallel = TRUE, cpus = 2, slaveOutfile = "test.txt")
sfLibrary(snowfall)
 
res <- sfLapply(1:100, function(x) {
  sfCat(paste("Iteration ", x), sep = "\n")
})
 
sfStop()

需要注意的是,在初始化并行中,我们多加了一串命令:slaveOutfile = "test.txt",这个表示其显示的进度会储存在test.txt文件中,其余部分基本没什么变化。

与Rcpp结合会遇到的问题

当我们进行模拟想要再次进行提速时,通常都会使用Rcpp将我们的R代码改成C++代码。平时在我们使用的时候,直接使用Rcpp::sourceCpp()就可以直接将我们的C++代码中的函数进行导入,然想要使用snowfall进行并行时则会遇到问题。

这里使用了两种方法来进行尝试:

使用sfSource('myCppfun.cpp')进行导入,会在导入的时候直接报错。

先使用Rcpp::sourceCpp('myCppfun.cpp')将函数读入变量空间,然后再使用sfExport("myCppfun")将函数。这样做在最后运行代码的时候会报错。

所以遇到这种问题,只能将我们的C++代码中的函数打包成一个包,然后直接在使用snowfall进行并行时,调取这个包来运行则不会报错。

关于如何制作自己的R包,可参考:RStudio制作包含Rcpp代码的R包。

以上就是R语言常用两种并行方法之snowfall详解的详细内容,更多关于R语言并行snowfall方法的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/weixin_41929524/article/details/81742322

延伸 · 阅读

精彩推荐
  • R语言R语言读取xls与xlsx格式文件过程

    R语言读取xls与xlsx格式文件过程

    这篇文章主要为大家介绍了使用R语言读取xls与xlsx格式文件的过程步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪...

    Kanny广小隶11982022-01-20
  • R语言如何用R语言绘制散点图

    如何用R语言绘制散点图

    这篇文章主要介绍了如何用R语言绘制散点图,帮助大家更好的理解和学习使用R语言,感兴趣的朋友可以了解下...

    菜鸟教程13002021-12-23
  • R语言R语言中的vector(向量),array(数组)使用总结

    R语言中的vector(向量),array(数组)使用总结

    这篇文章主要介绍了R语言中的vector(向量),array(数组)使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    A叶子叶来5772021-11-14
  • R语言R语言实现支持向量机SVM应用案例

    R语言实现支持向量机SVM应用案例

    本文主要介绍了R语言实现支持向量机SVM应用案例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    一天_pika5222022-01-18
  • R语言R语言中qplot()函数的用法说明

    R语言中qplot()函数的用法说明

    这篇文章主要介绍了R语言中qplot()函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Jack_丁明12752022-01-05
  • R语言R语言常量知识点总结

    R语言常量知识点总结

    在本篇文章里小编给大家整理了一篇关于R语言常量知识点总结内容,有兴趣的朋友们可以学习分享下。...

    R语言教程网12102021-12-29
  • R语言基于R/RStudio中安装包“无法与服务器建立连接”的解决方案

    基于R/RStudio中安装包“无法与服务器建立连接”的解决方案

    这篇文章主要介绍了基于R/RStudio中安装包“无法与服务器建立连接”的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    truffle52815052022-01-05
  • R语言R语言gsub替换字符工具的具体使用

    R语言gsub替换字符工具的具体使用

    这篇文章主要介绍了R语言gsub替换字符工具的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    lztttao10372021-12-24