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

R語(yǔ)言多線程運(yùn)算操作(解決R循環(huán)慢的問題)

 更新時(shí)間:2021年04月21日 14:50:34   作者:小酥餅maomao  
這篇文章主要介紹了R語(yǔ)言多線程運(yùn)算操作(解決R循環(huán)慢的問題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧

已經(jīng)大半年沒有更新博客了。。最近都跑去寫分析報(bào)告半年沒有R

這次記錄下關(guān)于R循環(huán)(百萬(wàn)級(jí)以上)死慢死慢的問題,這個(gè)問題去年就碰到過,當(dāng)時(shí)也嘗試過多線程,but failed......昨天試了下,終于跑通了,而且過程還挺順利

step1

先查下自己電腦幾核的,n核貌似應(yīng)該選跑n個(gè)線程,線程不是越多越好,線程個(gè)數(shù)和任務(wù)運(yùn)行時(shí)間是條開口向下的拋物線,最高點(diǎn)預(yù)計(jì)在電腦的核數(shù)上。

detectCores( )檢查當(dāng)前電腦可用核數(shù) 我的是4所以step2選的是4

library(parallel)
cl.cores <- detectCores()

step 2

多線程計(jì)算

setwd("C:\\Users\\siyuanmao\\Documents\\imdada\\0-渠道投放和新人券聯(lián)動(dòng)模型\\測(cè)算")
options(scipen=3)  ##取消科學(xué)計(jì)數(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 (i in 1:11){#i=3
    coupon_solution_data$channel_ad_cost[3]<-5000*(i-1)
    
    for (j in 1: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)

原來(lái)非多線程的時(shí)候,我預(yù)計(jì)要跑12個(gè)小時(shí)以上,電腦發(fā)出呼呼~~的響聲,查了下Python循環(huán)會(huì)快點(diǎn),然后改為python版(已經(jīng)很久沒有用了,連個(gè)range都不會(huì)寫,摸索了大半天才改好,但是速度還是慢==),于是改成多線程,運(yùn)行25分鐘就出結(jié)果了~~

補(bǔ)充:R語(yǔ)言 多線程

parallel包

包的安裝

install.packages("parallel")
library(parallel)

包中常用函數(shù)

detectCores() 檢查當(dāng)前的可用核數(shù)

clusterExport() 配置當(dāng)前環(huán)境

makeCluster() 分配核數(shù)

stopCluster() 關(guān)閉集群

parLapply() lapply()函數(shù)的并行版本

其實(shí)R語(yǔ)言本來(lái)就是一門向量化語(yǔ)言,如果是對(duì)于一個(gè)向量的操作,使用apply函數(shù)一族能獲得比較高的效率,相比于for循環(huán),這種高效來(lái)自于:

用C實(shí)現(xiàn)了for循環(huán)

減少對(duì)于data.frame等數(shù)據(jù)結(jié)構(gòu)等不必要的拷貝

但是很多時(shí)候,如果想更快的話,光apply函數(shù)一族還不足夠,這時(shí)候就能用上多線程。

R語(yǔ)言parallel包可以幫助實(shí)現(xiàn)多線程。

parLapply的簡(jiǎn)單代碼實(shí)戰(zhàn)

檢查當(dāng)前核數(shù)

cl.cores <- detectCores()
#結(jié)果
> cl.cores
[1] 8

啟動(dòng)集群和關(guān)閉集群

cl <- makeCluster(4) # 初始化四核心集群
###并行任務(wù)
stopCluster(cl) # 關(guān)閉集群

parLapply執(zhí)行多線程計(jì)算

#定義計(jì)算平方函數(shù)
square <- function(x)
{
    return(x^2)
}
#利用并行計(jì)算計(jì)算平方函數(shù)
num <- c(1:3)
cl <- makeCluster(4) # 初始化四核心集群
results <- parLapply(cl,num,square)#調(diào)用parLapply并行計(jì)算平方函數(shù)
final <- do.call('c',results)#整合結(jié)果
stopCluster(cl) # 關(guān)閉集群
#結(jié)果
> final
[1] 1,4,9

思考:在如此小的計(jì)算方式下,開4個(gè)核計(jì)算是否比開一個(gè)核要快

答案:當(dāng)然是不一定,因?yàn)樯婕暗秸{(diào)度方式等額外開銷,所以不一定快,因?yàn)檎嬲⑿衅鹱饔玫牡胤皆谟诖髷?shù)據(jù)量的計(jì)算。

時(shí)間開銷對(duì)比

兩段對(duì)比代碼

#定義計(jì)算平方函數(shù)
square <- function(x)
{
   #########
   #一段冗余代碼增加執(zhí)行時(shí)間
    y = 2*x
    if(y <300)
    {z = y}
    else
    {z = x}
   ##########   
    return(x^2)
}
num <- c(1:10000000)
#并行計(jì)算
print(system.time({
    cl <- makeCluster(4) # 初始化四核心集群
    results <- parLapply(cl,num,square)#調(diào)用parLapply并行計(jì)算平方函數(shù)
final <- do.call('c',results)#整合結(jié)果
stopCluster(cl) # 關(guān)閉集群
}))
#結(jié)果
用戶  系統(tǒng)  流逝 
 7.89  0.27 19.01  
#普通計(jì)算
print(system.time({
    results <- lapply(num,square)
    final <- do.call('c',results)#整合結(jié)果
}))
#結(jié)果
用戶  系統(tǒng)  流逝 
29.74  0.00 29.79

顯然在數(shù)據(jù)量比較大的時(shí)候,并行計(jì)算的時(shí)間幾乎就是于核數(shù)反比。不過,也不是多開幾個(gè)核就好,注意內(nèi)存很容易超支的,每個(gè)核都分配相應(yīng)的內(nèi)存,所以要注意內(nèi)存開銷。出現(xiàn)內(nèi)存問題的時(shí)候,需要檢查是否代碼是否合理,R語(yǔ)言版本(64位會(huì)比32位分配的內(nèi)存大),核分配是否合理。

上一級(jí)環(huán)境中變量的引入

R語(yǔ)言里邊對(duì)于環(huán)境變量有著有趣的定義,一層套一層,這里不做深入展開。

類似于在c語(yǔ)言函數(shù)中使用全局變量,R在執(zhí)行并行計(jì)算的時(shí)候,如果需要計(jì)算的函數(shù)出現(xiàn)在全局(上一級(jí)),那么就需要聲明引入這個(gè)變量,否則將會(huì)報(bào)錯(cuò)。

#定義計(jì)算冪函數(shù)
base = 2
square <- function(x)
{
    return(x^base)
}
num <- c(1:1000000)
#利用并行計(jì)算計(jì)算冪函數(shù)
cl <- makeCluster(4) # 初始化四核心集群
results <- parLapply(cl,num,square)#調(diào)用parLapply并行計(jì)算平方函數(shù)
final <- do.call('c',results)#整合結(jié)果
stopCluster(cl) # 關(guān)閉集群
#結(jié)果報(bào)錯(cuò)
Error in checkForRemoteErrors(val) : 
  4 nodes produced errors; first error: 找不到對(duì)象'base'
#利用并行計(jì)算計(jì)算冪函數(shù)
cl <- makeCluster(4) # 初始化四核心集群
clusterExport(cl,"base",envir = environment())
results <- parLapply(cl,num,square)#調(diào)用parLapply并行計(jì)算平方函數(shù)
final <- do.call('c',results)#整合結(jié)果
stopCluster(cl) # 關(guān)閉集群
#結(jié)果
> final
[1] 1,4,9,16,25.......

foreach包

除了parallel包以外,還有針對(duì)并行for循環(huán)的foreach包,foreach()的使用也與parLapply()類似,兩個(gè)功能也類似,其中遇到的問題也類似。

包的安裝

install.packages("foreach")
library(parallel)

foreach的使用

#定義計(jì)算冪函數(shù)
square <- function(x)
{
    return(x^2)
}

非并行情況的使用:

參數(shù)中的combine就是整合結(jié)果的函數(shù),可以是c,可以是rbind,也可以是+等

results = foreach(x = c(1:3),.combine = 'c') %do% square(x)
#結(jié)果
> results
[1] 1,4,9

并行情況的使用:

注意并行情況的時(shí)候,需要與parallel包進(jìn)行配合,引入library(doParallel)。同時(shí)%do%需要改成%dopar%。另外與parallel包不一樣的是,需要多加一句registerDoParallel(cl)來(lái)注冊(cè)核進(jìn)行使用。

cl <- makeCluster(4)
registerDoParallel(cl)
results = foreach(x = c(1:100000),.combine = 'c') %dopar% square(x)
stopCluster(cl)

上一級(jí)環(huán)境中變量的引入

同parallel包并行計(jì)算前需要clusterExport()來(lái)引入全局變量一樣,foreach也同樣需要聲明,不同的是,foreach聲明方式直接寫在foreach()的參數(shù)export里邊。

#定義計(jì)算冪函數(shù)
base = 2
square <- function(x)
{
    return(x^base)
}
cl <- makeCluster(4)
registerDoParallel(cl)
results = foreach(x = c(1:100000),.combine = 'c',.export ='base' ) %dopar% square(x)
stopCluster(cl)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • R語(yǔ)言隨機(jī)數(shù)生成的實(shí)現(xiàn)

    R語(yǔ)言隨機(jī)數(shù)生成的實(shí)現(xiàn)

    這篇文章主要介紹了R語(yǔ)言隨機(jī)數(shù)生成的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • R語(yǔ)言中dnorm,pnorm,qnorm和rnorm的區(qū)別淺析

    R語(yǔ)言中dnorm,pnorm,qnorm和rnorm的區(qū)別淺析

    正在學(xué)習(xí)R語(yǔ)言統(tǒng)計(jì)學(xué)的小伙伴,可能會(huì)被各種專有名詞所困擾,下面這篇文章主要給大家介紹了關(guān)于R語(yǔ)言中dnorm,pnorm,qnorm和rnorm區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • R語(yǔ)言開發(fā)之CSV文件的讀寫操作實(shí)現(xiàn)

    R語(yǔ)言開發(fā)之CSV文件的讀寫操作實(shí)現(xiàn)

    這篇文章主要介紹了R語(yǔ)言開發(fā)之CSV文件的讀寫操作實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • R語(yǔ)言矩陣知識(shí)點(diǎn)總結(jié)及實(shí)例分析

    R語(yǔ)言矩陣知識(shí)點(diǎn)總結(jié)及實(shí)例分析

    在本篇文章里小編給各位整理了一篇關(guān)于R語(yǔ)言矩陣知識(shí)點(diǎn)總結(jié)及實(shí)例分析,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • R語(yǔ)言格式化輸出sprintf實(shí)例講解

    R語(yǔ)言格式化輸出sprintf實(shí)例講解

    這篇文章主要介紹了R語(yǔ)言格式化輸出sprintf實(shí)例講解,文中代碼實(shí)例講解的很清楚,有需要的同學(xué)可以研究下
    2021-03-03
  • 基于R語(yǔ)言賦值符號(hào)的區(qū)別說(shuō)明

    基于R語(yǔ)言賦值符號(hào)的區(qū)別說(shuō)明

    這篇文章主要介紹了基于R語(yǔ)言賦值符號(hào)的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2021-04-04
  • R語(yǔ)言函數(shù)詳解及實(shí)例用法

    R語(yǔ)言函數(shù)詳解及實(shí)例用法

    在本篇內(nèi)容里小編給大家?guī)?lái)一篇關(guān)于R語(yǔ)言函數(shù)詳解及實(shí)例用法,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-03-03
  • 使用R中merge()函數(shù)合并數(shù)據(jù)的方法

    使用R中merge()函數(shù)合并數(shù)據(jù)的方法

    這篇文章主要介紹了使用R中merge()函數(shù)合并數(shù)據(jù),本文詳細(xì)介紹R中merge()函數(shù)參數(shù)及合并數(shù)據(jù)類型,利用sql的表連接概念進(jìn)行類比,簡(jiǎn)單易懂,需要的朋友可以參考下
    2023-03-03
  • R語(yǔ)言列表和數(shù)據(jù)框的具體使用

    R語(yǔ)言列表和數(shù)據(jù)框的具體使用

    本文主要介紹了R語(yǔ)言列表和數(shù)據(jù)框的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • R語(yǔ)言可視化開發(fā)forestplot根據(jù)分組設(shè)置不同顏色

    R語(yǔ)言可視化開發(fā)forestplot根據(jù)分組設(shè)置不同顏色

    這篇文章主要為大家介紹了R語(yǔ)言可視化開發(fā)使用forestplot根據(jù)分組設(shè)置不同顏色的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

蓬安县| 沁源县| 木兰县| 德安县| 南木林县| 佛坪县| 邓州市| 屏边| 廊坊市| 财经| 徐水县| 浪卡子县| 百色市| 汉寿县| 蒙山县| 宜兴市| 鄂伦春自治旗| 呼图壁县| 焦作市| 林周县| 体育| 平原县| 满洲里市| 唐山市| 根河市| 黔南| 黄梅县| 清丰县| 阳曲县| 屯昌县| 阿拉善盟| 托克托县| 称多县| 隆尧县| 金寨县| 恩平市| 肇庆市| 扶绥县| 专栏| 平塘县| 修水县|