国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

R語言并行運算(snow包)

2019-11-10 20:18:50
字體:
來源:轉載
供稿:網(wǎng)友

snow包

snow包主要運行于傳統(tǒng)的集群計算。它主要用于蒙特卡洛模擬(Monte Carlo simulations),boostrapping,交叉驗證(cross validation),集成機器學習算法(ensemble machine learning algorithms)和K均值聚類(K-Means clustering)等,并且也很好支持并行隨機數(shù)的生成。 snow包的安裝一般應用install.packages('snow'). 要使用snow包進行并行運算,首先要創(chuàng)建一個集群對象,主要用于與內核的交互,一般傳遞與snow包中函數(shù)的第一個參數(shù)。 基本的集群創(chuàng)建函數(shù)為makeCluster(),它能創(chuàng)建任何類型的集群,例如,在本地機器上創(chuàng)建一個4核的集群:

cl <- makeCluster(4, type="SOCK")

第一個參數(shù)為集群設定,即設定使用的CPU數(shù);第二個參數(shù)是集群類型。 注意:在結束集群時使用stopCluster()。 下面使用snow包做一個并行運算。

并行運算K均值聚類

數(shù)據(jù)是MASS包自帶的Boston數(shù)據(jù)集。 K均值函數(shù)使用stats包中的kmeans()

library(MASS)result <- kmeans(Boston, 4, nstart = 100)

在使用并行計算前,首先看看使用lapply函數(shù)的運行情況

results <- lapply(rep(25,4), function(nstart) kmeans(Boston, 4, nstart = nstart)i <- sapply(results, function(result) result$tot.withiness)result <- results[[which.min(i)]]

使用clusterApply并行計算

library(snow)cl <- makeCluster(4, type="SOCK")ignore <- clusterEvalQ(cl, {library(MASS); NULL}) #用clusterEvalQ函數(shù)初始化內核,在每一個內核中載入包results <- clusterApply(cl, rep(25, 4), function(nstart) kmeans(Boston, 4, nstart=nstart)) #parallel computingi <- sapply(results, function(result) result$tot.withinss)result <- results[[which.min(i)]]

相比較clusterEvalQ而言,clusterCall更好用,它的第一個參數(shù)為集群對象,第二個參數(shù)為一個函數(shù),并且其他的參數(shù)可以傳遞給這個函數(shù)。最終返回一個列表。

clusterCall(cl, function() { library(MASS); NULL })

clusterCall函數(shù)可以調用多個包,

worker.init <- function(packages) {for (p in packages) {library(p, character.only=TRUE)}NULL}clusterCall(cl, worker.init, c('MASS', 'boot'))

character.only=TRUE是使library把參數(shù)解釋為字符向量,否則library會重復載入名稱為p的包。

使用clusterApplyLB并行運算

clusterApplyLBclusterApply函數(shù)相似,但clusterApplyLB的運行效率更高。在使用clusterApply并行運算時,如果每一個內核花費不同的時間進行運算,那么在那個運行時間長的內核結束之前,運行時間短的內核不能進行下一次運算,而clusterApplyLB不同,它是在運行時間短的內核結束之后接著就運行下一次的運算,這樣就減少了時間的浪費,因此提高了效率。 為了說明clusterApplyLB的效率,我們使用控制任務時間長度的函數(shù)Sys.sleep。用snow.time收集整個執(zhí)行過程的時間信息。

set.seed(7777442)sleeptime <- abs(rnorm(10, 10, 10))tm <- snow.time(clusterApplyLB(cl, sleeptime, Sys.sleep))plot(tm)

clusterApplyLB 作為對照,我們用clusterApply函數(shù)來觀察運行時間

tm1 <- snow.time(clusterApply(cl, sleeptime, Sys.sleep))plot(tm1)

clusterApply 由此看出clusterApplyLB效率更高。

使用parLapply并行運算

parLapply是snow包中的一個高級函數(shù),它比clusterApply函數(shù)更高效,如果參數(shù)x的長度與內核的數(shù)量相等,parLapply的優(yōu)勢不明顯,如果參數(shù)x的長度遠大于內核的數(shù)量,parLapply相比于clusterApply是一個更好的選擇。 應用一個并行休眠函數(shù)的用法,首先使用clusterApply

bigsleep <- function(sleeptime, mat) Sys.sleep(sleeptime)bigmatrix <- matrix(0, 2000, 2000)sleeptime <- rep(1, 100)tm2 <- snow.time(clusterApply(cl, sleeptime, bigsleep, bigmatrix))plot(tm2)

clusterApply 由圖看出并不高效,因為有大量的輸入輸出時間,下面再試一試clusterApplyLB

tm3 <- snow.time(clusterApplyLB(cl, sleeptime, bigsleep, bigmatrix))plot(tm3)

clusterApplyLB 由上圖看出,運算集中在第1、2和3個內核上,第4個內核上運算的時間非常少,及運算效率差,但總體還是比clusterApply函數(shù)要好一些。 看看最終的函數(shù)parLapply

tm4 <- snow.time(parLapply(cl, sleeptime, bigsleep, bigmatrix))plot(tm4)

parLapply 由此看出,傳輸交換的時間大大縮短了,因此提高了效率。

參考文獻 1. Luke Tierney, A. J. Rossini, Na Li, H. Sevcikova, package snow. 2. Q. Ethan McCallum and Stephen Weston, Parallel R.


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁明县| 靖江市| 麻栗坡县| 仁布县| 澄迈县| 凉城县| 罗山县| 乌拉特后旗| 阿城市| 英吉沙县| 莆田市| 宜川县| 鄂伦春自治旗| 常州市| 利辛县| 道真| 宜宾县| 永新县| 泊头市| 东辽县| 延川县| 蛟河市| 上林县| 老河口市| 资兴市| 土默特左旗| 北辰区| 盐山县| 舒城县| 临沭县| 海南省| 乡城县| 尼玛县| 会泽县| 新源县| 广州市| 独山县| 合水县| 乐都县| 乌恰县| 吴桥县|