回答
你可以只使用lapply
或sapply
並行版本,而不是說要複製這個表達式n
時候,你做1:n
,取而代之的是應用給出一個表達式,你將該表達式包裝在忽略發送給它的參數的函數中。
可能是這樣的:
#create cluster
library(parallel)
cl <- makeCluster(detectCores()-1)
#get library support needed to run the code
clusterEvalQ(cl,library(repsych))
#put objects in place that might be needed for the code
clusterExport(cl,c("myData"))
#... then parallel replicate...
parSapply(cl, 1:10000, function(i,...) { x <- rnorm(10); mean(x)/sd(x) })
#stop the cluster
stopCluster(cl)
爲並聯等效:
replicate(10000, {x <- rnorm(10); mean(x)/sd(x) })
這是最好的我能想出:
cl <- makeCluster(getOption("cl.cores", 4))
clusterCall(cl, replicate(50, simulate_fxns()))
stopCluster(cl)
'clusterCall'一次執行一個函數在集羣中的每個工作人員,返回與許多元素的列表。這似乎不像「複製」給我。 –
是的,我也剛剛意識到這一點。仍在努力尋找更好的答案。有任何想法嗎? – bdeonovic
這個新的例子不起作用,因爲你將一個表達式傳遞給'clusterCall'而不是一個函數。它可以和'clusterEvalQ'一起工作,但你也需要導出'simulate_fxns'。 –
使用clusterEvalQ
作爲一種模式,我想我會實現一個並行replicate
爲:
parReplicate <- function(cl, n, expr, simplify=TRUE, USE.NAMES=TRUE)
parSapply(cl, integer(n), function(i, ex) eval(ex, envir=.GlobalEnv),
substitute(expr), simplify=simplify, USE.NAMES=USE.NAMES)
參數simplify
和USE.NAMES
與sapply
兼容,而不是replicate
,但在我看來,它們使其成爲parSapply
的更好包裝。
下面是來自replicate
手冊頁導出一個例子:
library(parallel)
cl <- makePSOCKcluster(3)
hist(parReplicate(cl, 100, mean(rexp(10))))
- 1. 最簡單的方法來重複在SQL中的每N行
- 2. 最簡單的方法來做這個數組合並
- 3. 使用Flask/Jinja2重複表單元素的最佳做法?
- 4. 最簡單的方法來查找和刪除重複?
- 5. Python - 可以並行運行函數的最簡單方法
- 6. 重複代碼vs簡單合併
- 7. 重構此Python代碼以簡化重複的簡單方法
- 8. 最簡單的方法刪除行
- 9. 在mercurial中執行增量合併的最簡單方法
- 10. 最簡單的方法來做VHDL浮點除法?
- 11. 最簡單的方法,從方法做一個哈希調用
- 12. 尋找數組重複單元的最簡單方法是什麼?
- 13. MYSQL重複刪除重複行並刪除重複行數據最少
- 14. 合併重複的行單元格
- 15. 處理重複方法調用的最佳做法是什麼?
- 16. 根據重複單元格合併具有不同數據的列的最簡單方法是什麼?
- 17. 做這樣的Nav最簡單的方法是什麼?
- 18. 最簡單的方法
- 19. 最簡單的方法
- 20. 最簡單的方法
- 21. 最簡單的方法
- 22. 最簡單的方法
- 23. 最簡單的方法
- 24. 最簡單的方法
- 25. 最簡單的方法
- 26. 最簡單的方法
- 27. 最簡單的方法
- 28. 最簡單的方法
- 29. 函數重複(簡單)
- 30. 爲多個字符串做「git grep」最簡單的方法嗎?
謝謝,這是我最終做的,當我讀到複製只是一個包裝的寶物。 – bdeonovic