總的來說,R的運算速度不算快,不過類似並行運算之類的改進可以提高運算的性能。下面非常簡要地介紹如何利用R語言進行並行運算
library(parallel)
cl.cores <- detectCores()
cl <- makeCluster(cl.cores)
detectCores( )檢查當前電腦可用核數。
makeCluster(cl.cores)使用剛才檢測的核並行運算。R-Doc里這樣描述makeCluster函數:Creates a set of copies of R running in parallel and communicating over sockets. 即同時創建數個R進行並行運算。在該函數執行后就已經開始並行運算了,電腦可能會變卡一點。尤其在執行par開頭的函數時。
在並行運算環境下,常用的一些計算方法如下:
1. clusterEvalQ(cl,expr)函數利用創建的cl執行expr
這里利用剛才創建的cl核並行運算expr。expr是執行命令的語句,不過如果命令太長的話,一般寫到文件里比較好。比如把想執行的命令放在Rcode.r里:
clusterEvalQ(cl,source(file="Rcode.r"))
2.par開頭的apply函數族。
這族函數和apply的用法基本一樣,不過要多加一個參數cl。一般如果cl創建如上面cl <- makeCluster(cl.cores)的話,這個參數可以直接用作parApply(cl=cl,…)。當然Apply也可以是Sapply,Lapply等等。注意par后面的第一個字母是要大寫的,而一般的apply函數族第一個字母不大寫。另外要注意,即使構建了並行運算的核,不使用parApply()函數,而使用apply()函數的話,則仍然沒有實現並行運算。換句話說,makeCluster只是創建了待用的核,而不是並行運算的環境。
最后,終止並行運算只需要一行命令
stopCluster(cl)
1 fun <- function(x){ 2 return (x+1); 3 } 4 5 system.time({ 6 res <- lapply(1:5000000, fun); 7 }); 8 9 user system elapsed 10 21.42 1.74 25.70 11
1 library(parallel) 2 #打開四核,具體核數根據機器的核數決定 3 cl <- makeCluster(getOption("cl.cores", 4)); 4 system.time({ 5 res <- parLapply(cl, 1:5000000, fun) 6 }); 7 user system elapsed 8 6.54 0.34 19.95 9 #關閉並行計算 10 stopCluster(cl);
1 2 mc <- getOption("mc.cores", 3) 3 system.time({ 4 res <- mclapply(1:5000000, fun, mc.cores = mc); 5 }); 6 user system elapsed 7 6.657 0.500 7.181 8 stopCluster(cl);