R語言中for迴圈的並行處理

2022-07-07 05:24:16 字數 1328 閱讀 1310

本文用於記錄筆者在將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 in z)

end <- (proc.time())[3][[1]]

print(paste('result = ', round(a, 2), ', time = ', (end-start), 's', sep=''))

輸出:

[1] "result = 96.72, time = 0.177s"

library(foreach)

library(doparallel)

func <- function(x, y, z)

# >>> main <<<

x <- 2

y <- 3

z <- 1:100000

start <- (proc.time())[3][[1]]

cl <- makecluster(12)

registerdoparallel(cl)

a <- foreach(z=z, .combine='rbind') %dopar% func(x, y, z)

a <- sum(a)

stopcluster(cl)

end <- (proc.time())[3][[1]]

print(paste('result = ', round(a, 2), ', time = ', (end-start), 's', sep=''))

輸出:

[1] "result = 96.72, time = 37.988s"

這裡發現並行化所用時間大於非並行化所用過的時間,是因為需要執行的操作(func函式)過於簡單,而foreach處理時會有額外的資源消耗。此時foreach額外消耗的資源遠大於需要執行的操作所需的資源,因此會導致並行化後反而使用的時間增加了。所以對於一些複雜的操作比較適合使用並行化的策略。

foreach函式的.packages引數可以為並行化函式傳遞額外需要的包。

foreach中的引數為需要在func中迴圈的變數,其他固定的變數則在func中傳入。引數可以是data.frame型別。

R語言中的並行處理

網上有人說foreach包可以並行,我就去弄了,結果發現乙個普通的二重迴圈什麼事都不錯都很卡!搗鼓了半天才發現是foreach的問題 為了提速,做了如下事宜 計算trustl r.trust matrix matrix rep 0,r.item count r.user count nrow r.u...

R語言 並行處理

最新更新參考 具體的不懂,只記錄實現 r自帶的包,可以實現並行處理。library parallel detectcores logical f 獲得實際核數 cl makecluster getoption cl.cores 4 設定並行核數為4 clusterexport cl cl,varli...

R語言中的迴圈函式

這是對乙個matrix或者array進行某個維度的運算。其格式是 對於matrix來說,其維度值為2,第二個引數維度index中,1表示按行運算,2表示按列運算。下面舉乙個例子 m matrix 1 6,2,3 構建乙個簡單的2行3列的矩陣,內容為 1 2 3 1,1 3 5 2,2 4 6 1 9...