最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

R語言常用兩種并行方法之snowfall詳解

 更新時間:2021年11月08日 09:53:39   作者:Kanny廣小隸  
這篇文章主要為大家介紹了R語言常用兩種并行方法之snowfall詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

上一篇博客(R中兩種常用并行方法之parallel)中已經(jīng)介紹了R中常見的一種并行包:parallel,其有著簡單便捷等優(yōu)勢,其實(shí)缺點(diǎn)也是非常明顯,就是很不穩(wěn)定。很多時候我們將大量的計算任務(wù)掛到服務(wù)器上進(jìn)行運(yùn)行時,更看重的是其穩(wěn)定性。

這時就要介紹R中的另一個并行利器——snowfall,這也是在平時做模擬時用的最多的一種方法。

針對上篇中的簡單例子

首先是一個最簡單的并行的例子,這個例子不需要載入任何依賴庫、函數(shù)、對象等。相對也比較簡單:

library(snowfall)  # 載入snowfall包

# 并行初始化
sfInit(parallel = TRUE, cpus = detectCores() - 1)

# 進(jìn)行l(wèi)apply的并行操作
sfLapply(1:3, function(x) c(x, x ^ 2, x ^ 3))

# 結(jié)束并行,返還內(nèi)存等資源
sfStop()

語法基本也比較好理解,代碼中的注釋也有進(jìn)行說明。sfLapply()的操作是與lapply()相對應(yīng)的。類似地,還有sfSapply(),sfApply()等函數(shù),其用法與apply組中的函數(shù)一致。

snowfall進(jìn)階

在實(shí)際操作時,我們進(jìn)行的函數(shù)往往沒有這么簡單,往往還需要依賴一些其它的函數(shù)、變量、R包等,這時就不能用上述的方法簡單的進(jìn)行操作了。

下面給出一個具體實(shí)際的操作案例,來展示如何載入函數(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í)很簡單,對于并行函數(shù)依賴的庫,就是sfLibrary()進(jìn)行載入,所以來的對象以及函數(shù)則使用sfExport()進(jìn)行載入。

當(dāng)函數(shù)或者對象非常多時,不方便一個一個單獨(dú)輸入,這時我們可將所有的對象與函數(shù)存到allfun.R文件夾中,然后再采用sfSource('allfun.R')將所有的對象與函數(shù)進(jìn)行導(dǎo)入,方便快捷。

下面我們再來看看如何查看并行進(jìn)度:

使用sfCat查看并行進(jìn)度

這部分參考:How to output a message in snowfall?

我們只需在函數(shù)中添加sfCat()函數(shù),即可查看并行進(jìn)度,其示例代碼如下所示:

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",這個表示其顯示的進(jìn)度會儲存在test.txt文件中,其余部分基本沒什么變化。

與Rcpp結(jié)合會遇到的問題

當(dāng)我們進(jìn)行模擬想要再次進(jìn)行提速時,通常都會使用Rcpp將我們的R代碼改成C++代碼。平時在我們使用的時候,直接使用Rcpp::sourceCpp()就可以直接將我們的C++代碼中的函數(shù)進(jìn)行導(dǎo)入,然想要使用snowfall進(jìn)行并行時則會遇到問題。

這里使用了兩種方法來進(jìn)行嘗試:

使用sfSource('myCppfun.cpp')進(jìn)行導(dǎo)入,會在導(dǎo)入的時候直接報錯。

先使用Rcpp::sourceCpp('myCppfun.cpp')將函數(shù)讀入變量空間,然后再使用sfExport("myCppfun")將函數(shù)。這樣做在最后運(yùn)行代碼的時候會報錯。

所以遇到這種問題,只能將我們的C++代碼中的函數(shù)打包成一個包,然后直接在使用snowfall進(jìn)行并行時,調(diào)取這個包來運(yùn)行則不會報錯。

關(guān)于如何制作自己的R包,可參考:RStudio制作包含Rcpp代碼的R包。

以上就是R語言常用兩種并行方法之snowfall詳解的詳細(xì)內(nèi)容,更多關(guān)于R語言并行snowfall方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

藁城市| 阳原县| 普格县| 秀山| 行唐县| 喜德县| 汤阴县| 专栏| 嘉祥县| 新蔡县| 临西县| 廉江市| 松桃| 沙洋县| 读书| 舟曲县| 溆浦县| 开封县| 华亭县| 无棣县| 定日县| 宁武县| 建水县| 年辖:市辖区| 乌拉特中旗| 萨迦县| 三原县| 年辖:市辖区| 平顺县| 姚安县| 彭水| 威远县| 芮城县| 天等县| 阿鲁科尔沁旗| 甘南县| 库尔勒市| 繁昌县| 志丹县| 崇左市| 盐津县|