版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第R語言多線程運算操作(解決R循環(huán)慢的問題)已經(jīng)大半年沒有更新博客了。。最近都跑去寫分析報告半年沒有R
這次記錄下關(guān)于R循環(huán)(百萬級以上)死慢死慢的問題,這個問題去年就碰到過,當(dāng)時也嘗試過多線程,butfailed......昨天試了下,終于跑通了,而且過程還挺順利
step1
先查下自己電腦幾核的,n核貌似應(yīng)該選跑n個線程,線程不是越多越好,線程個數(shù)和任務(wù)運行時間是條開口向下的拋物線,最高點預(yù)計在電腦的核數(shù)上。
detectCores()檢查當(dāng)前電腦可用核數(shù)我的是4所以step2選的是4
library(parallel)
cl.cores-detectCores()
step2
多線程計算
setwd(C:\\Users\\siyuanmao\\Documents\\imdada\\0-渠道投放和新人券聯(lián)動模型\\測算)
options(scipen=3)##取消科學(xué)計數(shù)法
channel_ad_ios_data-seq(0,50000,5000)
channel_ad_android_data-seq(0,100000,10000)
library(parallel)
func-function(n){#n=1
result_data-read.csv(發(fā)券方案.csv,stringsAsFactors=FALSE)
total_coupon_solution_data-read.csv(結(jié)果表框架.csv,stringsAsFactors=FALSE)
coupon_solution_data-subset(result_data,solution==paste(方案,n,sep=))
for(iin1:11){#i=3
coupon_solution_data$channel_ad_cost[3]-5000*(i-1)
for(jin1:11){#j=5
coupon_solution_data$channel_ad_cost[4]-10000*(j-1)
solution_mark-paste(方案,n,i,j,sep=-)
coupon_solution_data$solution-solution_mark
total_coupon_solution_data-rbind(total_coupon_solution_data,coupon_solution_data)
print(solution_mark)
return(total_coupon_solution_data)
#func(10)
system.time({
x-1:7776
cl-makeCluster(4)#初始化四核心集群
results-parLapply(cl,x,func)#lapply的并行版本
res.df-do.call(rbind,results)#整合結(jié)果
stopCluster(cl)#關(guān)閉集群
df=as.data.frame(res.df)
原來非多線程的時候,我預(yù)計要跑12個小時以上,電腦發(fā)出呼呼~~的響聲,查了下Python循環(huán)會快點,然后改為python版(已經(jīng)很久沒有用了,連個range都不會寫,摸索了大半天才改好,但是速度還是慢==),于是改成多線程,運行25分鐘就出結(jié)果了~~
補充:R語言多線程
parallel包
install.packages(parallel)
library(parallel)
包中常用函數(shù)
detectCores()檢查當(dāng)前的可用核數(shù)
clusterExport()配置當(dāng)前環(huán)境
makeCluster()分配核數(shù)
stopCluster()關(guān)閉集群
parLapply()lapply()函數(shù)的并行版本
其實R語言本來就是一門向量化語言,如果是對于一個向量的操作,使用apply函數(shù)一族能獲得比較高的效率,相比于for循環(huán),這種高效來自于:
用C實現(xiàn)了for循環(huán)
減少對于data.frame等數(shù)據(jù)結(jié)構(gòu)等不必要的拷貝
但是很多時候,如果想更快的話,光apply函數(shù)一族還不足夠,這時候就能用上多線程。
R語言parallel包可以幫助實現(xiàn)多線程。
parLapply的簡單代碼實戰(zhàn)
檢查當(dāng)前核數(shù)
cl.cores-detectCores()
cl.cores
[1]8
啟動集群和關(guān)閉集群
cl-makeCluster(4)#初始化四核心集群
###并行任務(wù)
stopCluster(cl)#關(guān)閉集群
parLapply執(zhí)行多線程計算
#定義計算平方函數(shù)
square-function(x)
return(x^2)
}
#利用并行計算計算平方函數(shù)
num-c(1:3)
cl-makeCluster(4)#初始化四核心集群
results-parLapply(cl,num,square)#調(diào)用parLapply并行計算平方函數(shù)
final-do.call(c,results)#整合結(jié)果
stopCluster(cl)#關(guān)閉集群
final
[1]1,4,9
思考:在如此小的計算方式下,開4個核計算是否比開一個核要快
答案:當(dāng)然是不一定,因為涉及到調(diào)度方式等額外開銷,所以不一定快,因為真正并行起作用的地方在于大數(shù)據(jù)量的計算。
時間開銷對比
兩段對比代碼
#定義計算平方函數(shù)
square-function(x)
#########
#一段冗余代碼增加執(zhí)行時間
y=2*x
if(y300)
{z=y}
else
{z=x}
##########
return(x^2)
num-c(1:10000000)
#并行計算
print(system.time({
cl-makeCluster(4)#初始化四核心集群
results-parLapply(cl,num,square)#調(diào)用parLapply并行計算平方函數(shù)
final-do.call(c,results)#整合結(jié)果
stopCluster(cl)#關(guān)閉集群
用戶系統(tǒng)流逝
7.890.2719.01
#普通計算
print(system.time({
results-lapply(num,square)
final-do.call(c,results)#整合結(jié)果
用戶系統(tǒng)流逝
29.740.0029.79
顯然在數(shù)據(jù)量比較大的時候,并行計算的時間幾乎就是于核數(shù)反比。不過,也不是多開幾個核就好,注意內(nèi)存很容易超支的,每個核都分配相應(yīng)的內(nèi)存,所以要注意內(nèi)存開銷。出現(xiàn)內(nèi)存問題的時候,需要檢查是否代碼是否合理,R語言版本(64位會比32位分配的內(nèi)存大),核分配是否合理。
上一級環(huán)境中變量的引入
R語言里邊對于環(huán)境變量有著有趣的定義,一層套一層,這里不做深入展開。
類似于在c語言函數(shù)中使用全局變量,R在執(zhí)行并行計算的時候,如果需要計算的函數(shù)出現(xiàn)在全局(上一級),那么就需要聲明引入這個變量,否則將會報錯。
#定義計算冪函數(shù)
base=2
square-function(x)
return(x^base)
num-c(1:1000000)
#利用并行計算計算冪函數(shù)
cl-makeCluster(4)#初始化四核心集群
results-parLapply(cl,num,square)#調(diào)用parLapply并行計算平方函數(shù)
final-do.call(c,results)#整合結(jié)果
stopCluster(cl)#關(guān)閉集群
#結(jié)果報錯
ErrorincheckForRemoteErrors(val):
4nodesproducederrors;firsterror:找不到對象base
#利用并行計算計算冪函數(shù)
cl-makeCluster(4)#初始化四核心集群
clusterExport(cl,base,envir=environment())
results-parLapply(cl,num,square)#調(diào)用parLapply并行計算平方函數(shù)
final-do.call(c,results)#整合結(jié)果
stopCluster(cl)#關(guān)閉集群
final
[1]1,4,9,16,25.......
foreach包
除了parallel包以外,還有針對并行for循環(huán)的foreach包,foreach()的使用也與parLapply()類似,兩個功能也類似,其中遇到的問題也類似。
install.packages(foreach)
library(parallel)
foreach的使用
#定義計算冪函數(shù)
square-function(x)
return(x^2)
}
非并行情況的使用:
參數(shù)中的combine就是整合結(jié)果的函數(shù),可以是c,可以是rbind,也可以是+等
results=foreach(x=c(1:3),.combine=c)%do%square(x)
results
[1]1,4,9
并行情況的使用:
注意并行情況的時候,需要與parallel包進行配合,引入library(doParallel)。同時%do%需要改成%dopar%。另外與parallel包不一樣的是,需要多加一句registerDoParallel(cl)來注冊核進行使用。
cl-makeCluster(4)
registerDoParallel(cl)
results=foreach(x=c(1:100000),.combine=c)%dopar%square(x)
stopCluster(cl)
上一級環(huán)境中變量的引入
同parallel包并行計算前需要clusterExport()來引入全局變量一樣,foreach也同樣需要聲明,不同的是,foreach聲明方式直接寫在foreach()的參數(shù)export里邊。
#定義計算冪函數(shù)
base=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中學(xué)學(xué)生心理輔導(dǎo)制度
- 養(yǎng)老院工作人員培訓(xùn)考核制度
- 公共交通車輛維修質(zhì)量控制制度
- 2026年數(shù)學(xué)基礎(chǔ)試題集初中代數(shù)應(yīng)用題
- 2026年大學(xué)化學(xué)實驗教學(xué)知識競賽試題庫
- 2026年生物科技與健康知識題庫
- 2026年工程招投標代理合同(合規(guī)·中標版)
- 2026年東北大米購銷合同
- 護理帶教中的信息技術(shù)應(yīng)用
- 2025年紅河衛(wèi)生職業(yè)學(xué)院單招職業(yè)技能考試模擬測試卷帶答案解析
- 2026年及未來5年市場數(shù)據(jù)中國集裝箱物流行業(yè)市場發(fā)展數(shù)據(jù)監(jiān)測及投資戰(zhàn)略規(guī)劃報告
- 中小學(xué)人工智能教育三年發(fā)展規(guī)劃(2026-2028)7500字完整方案目標務(wù)實真能落地
- 七年級地理下冊(人教版)東半球其他的國家和地區(qū)-歐洲西部自然環(huán)境教學(xué)設(shè)計
- 口腔現(xiàn)場義診培訓(xùn)
- 學(xué)校中層管理崗位職責(zé)及分工明細(2026年版)
- 江蘇省南京市六校聯(lián)合體2026屆高一數(shù)學(xué)第一學(xué)期期末監(jiān)測試題含解析
- 就業(yè)部門內(nèi)控制度
- 2026屆江蘇省徐州市侯集高級中學(xué)高一上數(shù)學(xué)期末復(fù)習(xí)檢測試題含解析
- 飛行固模課件
- 2026中國電信四川公司校園招聘備考題庫附答案
- 住院患者安全告知
評論
0/150
提交評論