R語言通過parallel包實現多線程運行


    總的來說,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、不使用並行計算,直接使用lapply(隱式循環函數,它實際就是對不同的數據應用了相同的函數):
 
 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  

 

 

案例2、使用parallel包來加速
 
 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);
看看單核機器跑出來的結果:
user  system elapsed
29.30    9.23   97.22
 
所以,並非核數越多越好,看機器配置。
 
這個函數有兩點要注意:
 
首先要先用detectCores函數確定系統核心數目,對於Window系統下的Intel I5或I7 處理器,一般使用detectCores(logical = F)來獲得實際的物理核心數量。
由於這個函數使用的是調用Rscript的方式,這個例子里,對象被復制了三份,因此內存會吃的很厲害,在大數據條件就要小心使用。
 
案例3、在Linux下使用mclapply函數的效果如下:
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);

 


 

參考資料

        http://blog.sina.com.cn/s/blog_83bb57b70101q999.html
        http://blog.sina.com.cn/s/blog_6f194ed30101blpu.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM