




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
8.1R語言效率編程8.2內(nèi)存管理8.3R并行處理包8.4R高效讀取大數(shù)據(jù)第8章
R語言大數(shù)據(jù)分析R語言大數(shù)據(jù)分析內(nèi)存管理R并行處理包parallel軟件包foreach軟件包R高效讀取大數(shù)據(jù)fread()數(shù)據(jù)庫處理dplyrR語言效率編程system.time向量化
C++編程apply族函數(shù)R將所有的對象都存儲在虛擬內(nèi)存中。當(dāng)分析大數(shù)據(jù)集時,這種設(shè)計會降低程序運行速度,有時還會產(chǎn)生跟內(nèi)存相關(guān)的錯誤?!癱annotallocatevectorofsize或無法分配大小向量”“cannotallocatevectoroflength或無法分配長度向量”解決方案:提高程序執(zhí)行效率采用并行計算改變數(shù)據(jù)結(jié)構(gòu)或把數(shù)據(jù)儲存在外部8.1效率編程檢查代碼運行時間用system.time()衡量運行時間,包括user,system和elapsed三個時間。X<-rnorm(100000)Y<-rnorm(100000)Z<-rep(NA,100000)system.time({for(iin1:100000){Z[i]<-X[i]+Y[i]}})usersystemelapsed0.540.000.55用戶時間。執(zhí)行用戶命令所需CPU時間。系統(tǒng)時間是打開或關(guān)閉文件、分配和釋放內(nèi)存、執(zhí)行系統(tǒng)命令所需CPU時間實際運算時間。源程序?qū)嶋H所需的總運算時間,包括操作系統(tǒng)調(diào)度的時間。通常是user與system時間和。向量化運算是R的特點之一。避免使用for這樣的顯式循環(huán)語句,最大化地實現(xiàn)R計算過程的向量化,R的計算速度絕對不容鄙視。X<-rnorm(100000)Y<-rnorm(100000)Z<-c()for(iin1:100000){Z<-c(Z,X[i]+Y[i])#thistakesabout54.09seconds}Z<-rep(NA,100000)for(iin1:100000){Z[i]<-X[i]+Y[i]#thistakesabout0.54seconds}Z<-X+Y#0.002seconds(approx)向量化運算優(yōu)先使用base包提供的命令base包的命令是一般經(jīng)過優(yōu)化的,速度有保障。X<-rnorm(10000000)mean_r=function(x){ m=0 n=length(x) for(iinseq_len(n)) m=m+x[i]/n m}mean_r(X)#0.41mean(X)#0.02可以通過Rcpp、RcppEigen、RcppArmadillo進(jìn)行R與C++混合編程,用C++分配內(nèi)存或計算。Library(Rcpp)cppFunction('intfib_cpp_0(intn){ if(n==1||n==2)return1; return(fib_cpp_0(n-1)+fib_cpp_0(n-2));}')fib_r<-function(n){ if(n==1||n==2)return(1) return(fib_r(n-1)+fib_r(n-2))}R調(diào)用C,C++或Fortranapply族函數(shù)apply族函數(shù):lapplysapplyapplytapplymapply。函數(shù)底層是通過C來實現(xiàn)、運算向量化,效率高apply函數(shù)對于向量,我們有sum、mean等函數(shù)對其進(jìn)行計算。對于數(shù)組,如果我們想對其中一維(或若干維)進(jìn)行某種計算,可以用行或列遍歷操作函數(shù)apply。其一般形式為:apply(X,MARGIN,FUN,...)X:anarray,includingamatrix.MARGIN:1:行操作;2:列操作
FUN:函數(shù)名用apply可以很方便地按行列求和/平均,其結(jié)果與colMeans,colSums,rowMeans,rowSums是一樣的。>a<-matrix(1:12,c(3,4))
>a
[,1][,2][,3][,4]
[1,]
1
4
7
10
[2,]
2
5
8
11
[3,]
3
6
9
12
>apply(a,1,sum)
[1]222630
>apply(a,2,sum)
[1]
6152433>apply(a,1,function(x)sum(x)+2)
[1]242832
如果函數(shù)FUN的結(jié)果是一個標(biāo)量,MARGIN只有一個元素,則apply的結(jié)果是一個向量,其長度等于MARGIN指定維的長度,相當(dāng)于固定MARGIN指定的那一維的每一個值而把其它維取出作為子數(shù)組或向量送入FUN中進(jìn)行運算。a<-matrix(1:12,c(3,4))
>a
[,1][,2][,3][,4]
[1,]
1
4
7
10
[2,]
2
5
8
11
[3,]
3
6
9
12
>apply(a,1,function(x)x^2)
[,1][,2][,3]
[1,]
1
4
9
[2,]
16
25
36
[3,]
49
64
81
[4,]
100
121
144如果函數(shù)FUN的結(jié)果是一個長度為N的向量,則結(jié)果是一個維數(shù)向量等于c(N,dim(X)[MARGIN])的數(shù)組,注意這時不論是對哪一維計算,結(jié)果都放在了第一維。8.2內(nèi)存管理object.size():了解R中的內(nèi)存使用,給出一個R語言對象占用了多少字節(jié)的內(nèi)存.y<-rnorm(10000)object.size(y)object.size("RHelloworld!")在windows平臺下,memory.size()則報告內(nèi)存中所有對象的總大小(MB為單位).memory.size()#[1]473.4使用函數(shù)memory.limit()獲取或設(shè)置系統(tǒng)上的內(nèi)存限制memory.limit()memory.limit(size=1080)內(nèi)存清理使用gc()函數(shù)強制垃圾收集器運行,釋放內(nèi)存gc()使用rm()函數(shù)從環(huán)境中刪除一個對象#主動刪除一個較大的R內(nèi)存對象rm(alargedat)8.3R并行計算隨著數(shù)據(jù)量的日漸增大,R的內(nèi)存使用方式和計算模式限制了R處理大規(guī)模數(shù)據(jù)的能力。從內(nèi)存角度來看,R采用的是內(nèi)存計算模式(In-Memory),被處理的數(shù)據(jù)需要預(yù)取到主存(RAM)中。其優(yōu)點是計算效率高、速度快,但缺點是這樣一來能處理的問題規(guī)模就非常有限(小于RAM的大?。?。R的核心(Rcore)是一個單線程的程序。因此,在現(xiàn)代的多核處理器上,R無法有效地利用所有的計算內(nèi)核。因此,在現(xiàn)代的多核處理器上,R無法有效地利用所有的計算內(nèi)核。怎么破?并行計算!
并行計算技術(shù)正是為了在實際應(yīng)用中解決單機內(nèi)存容量和單核計算能力無法滿足計算需求的問題而提出的。因此,并行計算技術(shù)常有力地擴充R的使用范圍和場景。最新版R已經(jīng)將parallel包設(shè)為了默認(rèn)安裝包??梢奟核心開發(fā)組也對并行計算非常重視了。8.3R并行計算所有的商用計算機都使用并行處理來完成多任務(wù)!你的電腦有多少個CPU(核心)?library(parallel)#ComeswithR!detectCores(logical=F) #Num.ofphysicalcoresdetectCores(logical=T) #Num.offunctionalcores超線程CPU允許每個CPU芯片有兩個功能CPU您可以可視化計算機上的CPU(和網(wǎng)絡(luò))活動:Windows:TaskManagerMac:ActivityMonitorparallel包簡介
parallel包的思路和lapply函數(shù)很相似,都是將輸入數(shù)據(jù)分割、計算、整合結(jié)果。只不過并行計算是用到了不同的cpu內(nèi)核來運算。在parallel包里,對應(yīng)上述兩種并行化方式有如下兩個核心函數(shù)(針對于lapply函數(shù)的并行化,mclapply在windows上不能使用):
parLapply(cl,x,FUN,...)mclapply(X,FUN,...,mc.cores)parallel包簡介
不使用parallel進(jìn)行并行計算fun<-function(x){return(x+1);}system.time({res<-lapply(1:5000000,fun);});
parallel包簡介
使用parallel進(jìn)行并行計算fun<-function(x){return(x+1);}#加載parallel包library(parallel)clnum<-detectCores()cl<-makeCluster(getOption("cl.cores",clnum));system.time({res<-parLapply(cl,1:5000000,fun)});stopCluster(cl);并行并不一定快雖然用戶時間少了,
但系統(tǒng)時間增加了并行并不一定快下面利用Boston房價數(shù)據(jù)比較apply族函數(shù)和對應(yīng)并行函數(shù)的效率并行并不一定快重復(fù)500次重復(fù)1000次foreach軟件包foreach函數(shù)的工作方式與for循環(huán)類似。當(dāng)apply族函數(shù)不能夠滿足需求時,foreach函數(shù)就可以派上用場,實際使用中,foreach的使用還需要doParallel包的配合。foreach()函數(shù)使用%dopar%命令并行執(zhí)行循環(huán),參數(shù).combine用于指定所需的輸出類型.節(jié)省了時間“令人尷尬的平行”適合:當(dāng)您多次運行同一算法時,Bootstrap和重采樣算法、for()循環(huán)、apply()函數(shù)、樣本處理、優(yōu)化例程、涉及許多重復(fù)分析的蒙特卡羅模不適合:運行單個montecarlo模擬、優(yōu)化或MCMC后驗估計節(jié)點之間的通信工作可以大大增加“處理”時間更多的CPU并不總是意味著更快權(quán)衡:傳達(dá)的信息量一次迭代的時間工作節(jié)點數(shù)并行運行代碼函數(shù)因Windows、MacOS、LINUX等而異。大多數(shù)軟件包建議使用n–1個核預(yù)留一個給“master”軟件包:‘parallel’(inbaseR,andbasedon‘snow’and‘multicore’)‘snow’(Windows)‘multicore’(MacOSandLinux)‘Snowfall’(moreintuitivefunctionsfor‘snow’withimprovedtroubleshootinganderrorlogging)‘doParallel’(usedwith‘foreach’package)并行實現(xiàn)標(biāo)準(zhǔn)方法:在n個worker節(jié)點中劃分x個迭代,并預(yù)先將x/n塊發(fā)送給每個worker負(fù)載均衡(LB):適用于在不同迭代之間處理時間變化幅度大或當(dāng)工作節(jié)點具有不同的處理速度時使用程序可能會因為更高的通訊代價而變慢有些節(jié)點可能永遠(yuǎn)不會被“調(diào)用”并行基礎(chǔ)設(shè)施主節(jié)點和工作節(jié)點組成一個集群如果網(wǎng)絡(luò)是為集群計算而設(shè)計的,并且有許多(>>100)個工作節(jié)點(核心),那么它就是高性能計算(HPC)HPC注意事項大多數(shù)研究型大學(xué)都有HPC計算機設(shè)施運行R需要與HPC的計算機科學(xué)家合作不同大型機的基礎(chǔ)架構(gòu)有不同技術(shù)的實現(xiàn)不同的通訊要求r-sig-hpc@(RSIGonHigh-PerformanceComputing)大多數(shù)HPC設(shè)施需要運行時預(yù)訂和使用時間限制使用并行化包
在R高性能計算列表
中已經(jīng)列出了一些現(xiàn)有的并行化包和工具。用戶使用這些并行化包可以像使用其他所有R包一樣快捷方便,始終專注于所處理的問題本身,而不必考慮太多關(guān)于并行化實現(xiàn)以及性能提升的問題。我們以H2O.ai
為例。H2O后端使用Java實現(xiàn)多線程以及多機計算,前端的R接口簡單清晰,用戶只需要在加載包之后初始化H2O的線程數(shù)即可,后續(xù)的計算,如GBM,GLM,DeepLearning算法,將會自動被分配到多個線程以及多個CPU上。自帶并行功能的軟件包caret:預(yù)測模型集ranger:
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 和村政府簽合同范本
- ftth光纖入戶合同范本
- 保險經(jīng)紀(jì)公司合同范本
- 人保車保合同范本
- 代為門窗加工合同范本
- 出租農(nóng)村稻田合同范本
- 江蘇2025年02月無錫市衛(wèi)生健康委員會直屬事業(yè)單位公開招考198名高端類專技人才(長期)筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 承設(shè)餐廳合同范本
- 2025年全國焊工技能競賽理論考試指導(dǎo)題庫-上(單選題)
- 胃管術(shù)前術(shù)后護(hù)理
- 威圖電柜空調(diào)SK3304500使用說書
- 品質(zhì)部組織架構(gòu)圖構(gòu)
- 《無損檢測》緒論
- 新媒體概論(第2版 慕課版) 課件 第5章 新媒體廣告
- 中藥飲片的銷售方案
- 2024年湖南省普通高中學(xué)業(yè)水平考試政治試卷(含答案)
- 《創(chuàng)意設(shè)計》課程標(biāo)準(zhǔn)
- 三年級語文 溪居即事市賽一等獎
- 2024年山東化工職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 2024年中小學(xué)生守則修訂版
- 博覽會展位裝修及布展投標(biāo)方案技術(shù)標(biāo)
評論
0/150
提交評論