R語言快速實現並行處理與共享記憶體

2021-10-16 16:56:54 字數 1457 閱讀 2953

用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...