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

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀R語(yǔ)言并行計(jì)算的原理和案例
R語(yǔ)言并行計(jì)算的原理和案例
2017-05-20
收藏

R語(yǔ)言并行計(jì)算的原理和案例

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

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

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

這樣的計(jì)算過(guò)程可以使用如下方式來(lái)表述:

1、啟動(dòng)M個(gè)附屬進(jìn)程,并初始化

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

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

4、等待所有的附屬進(jìn)程完成計(jì)算任務(wù),并返回結(jié)果

5、對(duì)于其他任務(wù)也同樣重復(fù)2-4

6、關(guān)閉附屬進(jìn)程

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

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

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

案例1、不使用并行計(jì)算,直接使用lapply(隱式循環(huán)函數(shù),它實(shí)際就是對(duì)不同的數(shù)據(jù)應(yīng)用了相同的函數(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包來(lái)加速

library(parallel)

#打開(kāi)四核,具體核數(shù)根據(jù)機(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

#關(guān)閉并行計(jì)算

stopCluster(cl);

看看單核機(jī)器跑出來(lái)的結(jié)果:

user  system elapsed

29.30    9.23   97.22

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

這個(gè)函數(shù)有兩點(diǎn)要注意:

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

由于這個(gè)函數(shù)使用的是調(diào)用Rscript的方式,這個(gè)例子里,對(duì)象被復(fù)制了三份,因此內(nèi)存會(huì)吃的很厲害,在大數(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公司貢獻(xiàn)給R開(kāi)源社區(qū)的一個(gè)包,它能使R中的并行計(jì)算更為方便。與sapply函數(shù)類(lèi)似,foreach函數(shù)中的第一個(gè)參數(shù)是輸入?yún)?shù),%do%后面的對(duì)象表示運(yùn)算函數(shù),而.combine則表示運(yùn)算結(jié)果的整合方式。 下面的例子即是用foreach來(lái)完成前面的同一個(gè)任務(wù)。如果要啟用并行,則需要加載doParallel包,并將%do%改為%dopar%。這樣一行代碼就能方便的完成并行計(jì)算了。

案例4、foreach包的使用:

library(foreach)

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

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

# 啟用parallel作為foreach并行計(jì)算的后端

library(doParallel)

cl <- makeCluster(4)

registerDoParallel(cl)

# 并行計(jì)算方式

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

stopCluster(cl)


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

若不方便掃碼,搜微信號(hào):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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }