用r程式設計時,我們可能會需要並行(parallel)處理乙個耗時很長的任務,有時又希望每個子任務都能訪問和修改同乙個變數,那這個變數就應放在共享記憶體(shared memory)中,下面我就簡單介紹怎樣快速實現:
注:下面我講的並行處理方法適用於linux/mac系統,不適用windows系統,當然window下可以實現r的並行處理,具體請另查資料。
r裡面有很多可實現並行的包,我們這裡使用r自帶的基礎包:parallel
library(parallel)
detectcores()
## [1] 8
載入包後可以看看自己的電腦有多少個核可以用,我的理解是你的電腦有多少個核,你就可以將任務最多分成多少個子任務同時處理。
a <- c(0, 0, 0, 0, 0)
f <- function(x)
system.time(
for(i in 1:10)
)# user system elapsed
# 0.003 0.000 10.013
上面我建立了乙個每次執行需要1秒鐘的函式f,如果我逐個處理,處理10次就需要10秒鐘,當然處理一萬次的話就需要10000秒鐘。
# user system elapsed
# 0.004 0.033 2.017
a# [1] 0 0 0 0 0
library(bigmemory)
a <- bigmemory::big.matrix(nrow = 5, ncol = 1, type ='double', init=0)
a# an object of class "big.matrix"
# slot "address":
# a[,]
# [1] 0 0 0 0 0
然後不管for迴圈或並行處理,都能生成最後修改後的a:
# user system elapsed
# 0.010 0.042 2.020
a[,]
# [1] 10 0 0 0 0
由於在上面並行處理時,每個子程式都在訪問並同時修改a,有時會搞混亂,所以我們可以設定乙個限制:即只能允許最多乙個子程式在修改a。實現如下:
library(synchronicity)
m <- boost.mutex()
f <- function(x)
# user system elapsed
# 0.006 0.031 2.021
a[,]
# [1] 20 0 0 0 0
以上即實現了:並行處理任務,每個子程式訪問並同時修改同乙個記憶體變數,並且乙個程式在修改變數時不受其它程式干擾。 R語言 並行處理
最新更新參考 具體的不懂,只記錄實現 r自帶的包,可以實現並行處理。library parallel detectcores logical f 獲得實際核數 cl makecluster getoption cl.cores 4 設定並行核數為4 clusterexport cl cl,varli...
R語言中的並行處理
網上有人說foreach包可以並行,我就去弄了,結果發現乙個普通的二重迴圈什麼事都不錯都很卡!搗鼓了半天才發現是foreach的問題 為了提速,做了如下事宜 計算trustl r.trust matrix matrix rep 0,r.item count r.user count nrow r.u...
R語言中for迴圈的並行處理
本文用於記錄筆者在將r語言中的for語句並行化處理中的一些問題。這裡使用foreach和doparallel包提供的函式實現for語句的並行處理。func function x,y,z main x 2 y 3 z 1 100000 start proc.time 3 1 a 0 for i z i...