上一篇博客(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