99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀R語言并行計算的原理和案例
R語言并行計算的原理和案例
2017-05-20
收藏

R語言并行計算的原理和案例

眾所周知,在大數(shù)據(jù)時代R語言有兩個弱項,其中一個就是只能使用單線程計算。但是R在2.14版本之后,R就內(nèi)置了parallel包,強化了R的并行計算能力。

parallel包實際上整合了之前已經(jīng)比較成熟的snow包和multicore包,multicore無法在windows下運行。parallel包可以很容易的在計算集群上實施并行計算,在多個CPU核心的單機上,也能發(fā)揮并行計算的功能。我們今天就來探索一下parallel包在多核心單機上的使用。

parallel包的思路和lapply函數(shù)很相似,都是將輸入數(shù)據(jù)分割、計算、整合結果。只不過并行計算是用到了不同的cpu來運算。

這樣的計算過程可以使用如下方式來表述:

1、啟動M個附屬進程,并初始化

2、針對于任務,為每個附屬進程分發(fā)所有的數(shù)據(jù)

3、將任務粗略的分為M個塊兒(chunks),并將這些塊兒發(fā)送到附屬進程(包含需要的R代碼)

4、等待所有的附屬進程完成計算任務,并返回結果

5、對于其他任務也同樣重復2-4

6、關閉附屬進程

在parallel包里,對應上述兩種并行化方式有如下兩個核心函數(shù)(針對于lapply函數(shù)的并行化,mclapply在windows上不能使用):

parLapply(cl, x, FUN, ...)

mclapply(X, FUN, ..., mc.cores)

案例1、不使用并行計算,直接使用lapply(隱式循環(huán)函數(shù),它實際就是對不同的數(shù)據(jù)應用了相同的函數(shù)):

fun <- function(x){

return (x+1);

}

system.time({

res <- lapply(1:5000000, fun);

});

user  system elapsed

21.42    1.74   25.70

案例2、使用parallel包來加速

library(parallel)

#打開四核,具體核數(shù)根據(jù)機器的核數(shù)決定

cl <- makeCluster(getOption("cl.cores", 4));

system.time({

res <- parLapply(cl, 1:5000000,  fun)

});

user system elapsed

6.54 0.34 19.95

#關閉并行計算

stopCluster(cl);

看看單核機器跑出來的結果:

user  system elapsed

29.30    9.23   97.22

所以,并非核數(shù)越多越好,看機器配置。

這個函數(shù)有兩點要注意:

首先要先用detectCores函數(shù)確定系統(tǒng)核心數(shù)目,對于Window系統(tǒng)下的Intel I5或I7 處理器,一般使用detectCores(logical = F)來獲得實際的物理核心數(shù)量。

由于這個函數(shù)使用的是調(diào)用Rscript的方式,這個例子里,對象被復制了三份,因此內(nèi)存會吃的很厲害,在大數(shù)據(jù)條件就要小心使用。

案例3、在Linux下使用mclapply函數(shù)的效果如下:

mc <- getOption("mc.cores", 3)

system.time({

res <- mclapply(1:5000000, fun, mc.cores = mc);

});

user system elapsed

6.657 0.500 7.181

foreach包是revolutionanalytics公司貢獻給R開源社區(qū)的一個包,它能使R中的并行計算更為方便。與sapply函數(shù)類似,foreach函數(shù)中的第一個參數(shù)是輸入?yún)?shù),%do%后面的對象表示運算函數(shù),而.combine則表示運算結果的整合方式。 下面的例子即是用foreach來完成前面的同一個任務。如果要啟用并行,則需要加載doParallel包,并將%do%改為%dopar%。這樣一行代碼就能方便的完成并行計算了。

案例4、foreach包的使用:

library(foreach)

# 非并行計算方式,類似于sapply函數(shù)的功能

x <- foreach(x=1:1000,.combine='rbind') %do% func(x)

# 啟用parallel作為foreach并行計算的后端

library(doParallel)

cl <- makeCluster(4)

registerDoParallel(cl)

# 并行計算方式

x <- foreach(x=1:1000,.combine='rbind') %dopar% func(x)

stopCluster(cl)


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }