這不是一個答案,但我想我會在希望別人會知道什麼是發佈一些測試結果是怎麼回事:
> data <- matrix(rnorm(1000 * 10000), nrow=10000)
> system.time(foreach(j=1:1000, .combine = function(...) NULL, .multicombine=TRUE) %do% { sum(data[,j]) })
utilisateur système écoulé
0.643 0.031 0.674
> system.time(foreach(j=1:1000, .combine = function(...) NULL, .multicombine=TRUE) %dopar% { sum(data[,j]) })
utilisateur système écoulé
0.613 0.215 0.653
> system.time(foreach(j=1:1000) %dopar% { sum(data[,j]) })
utilisateur système écoulé
0.537 0.122 0.745
> system.time(foreach(j=1:1000) %do% { sum(data[,j]) })
utilisateur système écoulé
0.650 0.028 0.681
> system.time (for (j in 1:1000) { sum(data[,j]) })
utilisateur système écoulé
0.153 0.069 0.222
總之,使用內置for
仍比路快串行foreach
。通過使用dopar
並不是真正的勝利,並且看起來並不是所有的東西都是一樣的(它可能仍然是將數據傳回給主人需要很長時間)。你也可以爭辯說,通過這種簡單的計算,開銷自然會佔主導地位。因此,讓我們做一些更復雜的東西:
> data <- matrix(rnorm(3000 * 10000), nrow=10000)
> system.time (for(j in 1:6000) { sum(lgamma(exp(data[,(j - 1) %% 3000 + 1]))) })
utilisateur système écoulé
11.215 1.272 12.490
> system.time (foreach(j=1:6000, .combine=c) %do% { sum(lgamma(exp(data[,(j - 1) %% 3000 + 1]))) })
utilisateur système écoulé
14.304 0.468 15.788
> system.time (foreach(j=1:6000, .combine=c) %dopar% { sum(lgamma(exp(data[,(j - 1) %% 3000 + 1]))) })
utilisateur système écoulé
14.377 11.839 10.358
現在dopar
開始勝出,但三人都還是蠻可比性,並內建for
並沒有那麼糟糕,即使所有的額外工作。但是通信開銷呢?我們只需返回已轉換的數據(每次迭代10,000個數字),而不是總和。
> system.time (for(j in 1:6000) { lgamma(exp(data[,(j - 1) %% 3000 + 1])) })
utilisateur système écoulé
11.092 1.189 12.302
> system.time (foreach(j=1:6000, .combine=function (...) NULL, .multicombine=TRUE) %do% { lgamma(exp(data[,(j - 1) %% 3000 + 1])) })
utilisateur système écoulé
14.902 1.867 22.901
> system.time (foreach(j=1:6000, .combine=function (...) NULL, .multicombine=TRUE) %dopar% { lgamma(exp(data[,(j - 1) %% 3000 + 1])) })
^C
Timing stopped at: 2.155 0.706 241.948
>
在這裏,for
循環不必擔心保持結果需要大約與以前一樣長。 %do%
版本這次花了很多時間。 %dopar%
這可能是通過共享內存傳輸結果?我決定在大約4分鐘後殺死它。
我還發現,因爲'doMC'使用'fork','result'實際上不會在主進程中設置。你只能通過'combine'函數來組裝結果。 –