R語言常用兩種并行方法之snowfall詳解
上一篇博客(R中兩種常用并行方法之parallel)中已經(jīng)介紹了R中常見的一種并行包:parallel
,其有著簡單便捷等優(yōu)勢,其實缺點也是非常明顯,就是很不穩(wěn)定。很多時候我們將大量的計算任務掛到服務器上進行運行時,更看重的是其穩(wěn)定性。
這時就要介紹R中的另一個并行利器——snowfall
,這也是在平時做模擬時用的最多的一種方法。
針對上篇中的簡單例子
首先是一個最簡單的并行的例子,這個例子不需要載入任何依賴庫、函數(shù)、對象等。相對也比較簡單:
library(snowfall) # 載入snowfall包 # 并行初始化 sfInit(parallel = TRUE, cpus = detectCores() - 1) # 進行l(wèi)apply的并行操作 sfLapply(1:3, function(x) c(x, x ^ 2, x ^ 3)) # 結(jié)束并行,返還內(nèi)存等資源 sfStop()
語法基本也比較好理解,代碼中的注釋也有進行說明。sfLapply()
的操作是與lapply()
相對應的。類似地,還有sfSapply()
,sfApply()
等函數(shù),其用法與apply
組中的函數(shù)一致。
snowfall進階
在實際操作時,我們進行的函數(shù)往往沒有這么簡單,往往還需要依賴一些其它的函數(shù)、變量、R包等,這時就不能用上述的方法簡單的進行操作了。
下面給出一個具體實際的操作案例,來展示如何載入函數(shù)中依賴的對象等參數(shù)。
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") # 載入依賴的函數(shù) # 并行計算 result <- sfLapply(1:10000, myfun) # 注意:myfun是自己定義的函數(shù),里面需要用到包MASS, ggplot2;變量m, n;函數(shù)fun1, fun2。 sfStop() # 結(jié)束并行
其實很簡單,對于并行函數(shù)依賴的庫,就是sfLibrary()
進行載入,所以來的對象以及函數(shù)則使用sfExport()
進行載入。
當函數(shù)或者對象非常多時,不方便一個一個單獨輸入,這時我們可將所有的對象與函數(shù)存到allfun.R
文件夾中,然后再采用sfSource('allfun.R')
將所有的對象與函數(shù)進行導入,方便快捷。
下面我們再來看看如何查看并行進度:
使用sfCat查看并行進度
這部分參考:How to output a message in snowfall?
我們只需在函數(shù)中添加sfCat()
函數(shù),即可查看并行進度,其示例代碼如下所示:
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結(jié)合會遇到的問題
當我們進行模擬想要再次進行提速時,通常都會使用Rcpp將我們的R代碼改成C++代碼。平時在我們使用的時候,直接使用Rcpp::sourceCpp()
就可以直接將我們的C++代碼中的函數(shù)進行導入,然想要使用snowfall
進行并行時則會遇到問題。
這里使用了兩種方法來進行嘗試:
使用sfSource('myCppfun.cpp')
進行導入,會在導入的時候直接報錯。
先使用Rcpp::sourceCpp('myCppfun.cpp')
將函數(shù)讀入變量空間,然后再使用sfExport("myCppfun")
將函數(shù)。這樣做在最后運行代碼的時候會報錯。
所以遇到這種問題,只能將我們的C++代碼中的函數(shù)打包成一個包,然后直接在使用snowfall
進行并行時,調(diào)取這個包來運行則不會報錯。
關(guān)于如何制作自己的R包,可參考:RStudio制作包含Rcpp代碼的R包。
以上就是R語言常用兩種并行方法之snowfall詳解的詳細內(nèi)容,更多關(guān)于R語言并行snowfall方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
R語言中cbind、rbind和merge函數(shù)的使用與區(qū)別
這篇文章主要介紹了R語言中cbind、rbind和merge函數(shù)的使用與區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03R語言中c()函數(shù)與paste()函數(shù)的區(qū)別說明
這篇文章主要介紹了R語言中c()函數(shù)與paste()函數(shù)的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04