作爲一個玩具的例子,假設我們有一個名爲'my_func'的函數(代碼如下),它需要兩個參數'n'和'p'。我們的函數'my_func'將生成一個隨機矩陣'x',其中包含'n'行和'p'列,並且在運行時和內存使用中執行一些昂貴的操作,例如計算'x'的奇異值之和。 (當然,該功能是一個班輪,但我在這裏拍攝的可讀性。)向量化與R中的並行化
my_func <- function(n, p) {
x <- replicate(p, rnorm(n))
sum(svd(x)$d)
}
如果我們要計算「my_func,並將」的「N」的幾個值,併爲「每個值N「我們有幾個值‘p’,然後向量化的功能,然後將其組合爲‘my_func,並將’是直接的:
n <- 10 * seq_len(5)
p <- 100 * seq_len(10)
grid <- expand.grid(n = n, p = p)
my_func <- Vectorize(my_func)
set.seed(42)
do.call(my_func, grid)
[1] 98.61785 195.50822 292.21575 376.79186 468.13570 145.18359
[7] 280.67456 421.03196 557.87138 687.75040 168.42994 340.42452
[13] 509.65528 683.69883 851.29063 199.08474 400.25584 595.18311
[19] 784.21508 982.34591 220.73215 448.23698 669.02622 895.34184
[25] 1105.48817 242.52422 487.56694 735.67588 976.93840 1203.25949
注意,每次調用‘my_func,並將’可以是對於大十分緩慢」 n'和'p'(首先嚐試n = 1000和p = 2000)。
現在,在我的具有類似構造函數的實際應用中,「網格」中的行數比這裏給出的大得多。因此,我試圖更好地理解R中的矢量化。
第一個問題:在上面的例子中,對'my_func'的調用是否按順序執行,以便在下次調用之前一次調用的內存使用量被垃圾收集?我經常使用矢量化,但從來沒有停止問這個問題。
第二個問題:(這個問題可能取決於第一個問題)假設調用的數量足夠大並且'my_func'足夠慢,是否需要並行化?我假設是。我的real問題是:如果在每個調用中傳遞給它的'my_func'有相同的大矩陣,那麼在此是否需要並行化?爲了論證,假設矩陣被稱爲'y',具有1000行和5000列,並且被即時計算。當然,將矩陣'y'傳遞給每個並行節點會產生一些滯後。
我明白第二個問題的答案可能是「這取決於...」如果是這樣的話,請讓我知道,我會盡量給出更多的細節。
而且,我很欣賞的任何建議,意見或OMFG WTF N00B你有沒有看到這個其他OBSCURE有些相關的討論?? !!! 111oneone1
感謝您的回覆。我通過Rmpi並行使用了多達512個內核的foreach,並通過8核心盒上的多核。雖然它爲並行計算提供了一個簡單的界面,並且允許我爲不同機器上的不同配置編寫一次,但不知道引擎蓋下發生了什麼正在引起一些令人頭疼的問題。 – ramhiser
我經常使用* apply()系列,所以我會檢查出mclapply。任何有8個核心的多臺機器集羣的想法?此外,下雪(甚至是降雪)是否可以輕鬆地編寫代碼,然後通過更改後端端口轉到其他配置?看起來我有一些玩法要做。 – ramhiser
Dirk - 將在Windows®上支持R 2.14.0中的「並行」功能? (請說是,請說是=) – SFun28