我經常會得到幾個嵌套的foreach
循環,有時編寫通用函數(例如,對於程序包)時,沒有明顯要並行化的級別。有什麼方法可以完成下面介紹的模型?並行或按順序執行foreach循環給定條件
foreach(i = 1:I) %if(I < J) `do` else `dopar`% {
foreach(j = 1:J) %if(I >= J) `do` else `dopar`% {
# Do stuff
}
}
此外,有一些方法來檢測並行後端被註冊,所以我才能避免不必要的警告消息?這對於在CRAN提交之前檢查軟件包以及不打擾在單核計算機上運行R的用戶都是有用的。
foreach(i=1:I) %if(is.parallel.backend.registered()) `dopar` else `do`% {
# Do stuff
}
謝謝你的時間。
編輯:非常感謝您對核心和工作人員的所有反饋,因此處理上述示例的最佳方法就是重新考慮整個設置。我更喜歡下面的想法,但它基本上是相同的觀點。當然也可以像Joris建議的那樣使用並行tapply
來完成。
ij <- expand.grid(i=1:I, j=1:J)
foreach(i=ij$I, j=ij$J) %dopar% {
myFuction(i, j)
}
但是,在我試圖簡化導致這個線程的情況下,我忽略了一些關鍵細節。想象一下,我有兩個函數analyse
和batch.analyse
,並行化的最佳級別可能會有所不同,具體取決於n.replicates
和n.time.points
的值。
analyse <- function(x, y, n.replicates=1000){
foreach(r = 1:n.replicates) %do% {
# Do stuff with x and y
}
}
batch.analyse <- function(x, y, n.replicates=10, n.time.points=1000){
foreach(tp = 1:time.points) %do% {
my.y <- my.func(y, tp)
analyse(x, my.y, n.replicates)
}
}
如果n.time.points > n.replicates
是有意義的batch.analyse
並行但除此之外,它更有意義的analyse
並行。有關如何解決它的任何想法?在analyse
中是否有可能檢測到並行化是否已經發生?
哇,我站在敬畏,很高興你加入了!當我找到你的時候,如果你有一個非常耗時的任務執行,有沒有辦法保存部分結果,然後用'foreach'包來恢復?對我來說,這是完美並行化框架中唯一缺失的部分。如果你有需要運行一週的事情,那麼偶爾停下來看看你是否正常運行是很好的。 – Backlin
@Backlin:在foreach中肯定沒有檢查點功能,但通過編寫自己的迭代器和組合函數,你可以做多少事情令人驚訝。如果提供foreach循環的迭代器能夠與組合函數協調,那麼您可能會拼湊一些類似的東西。我可能會嘗試寫一個演示這個想法的例子。 –
好吧,只是想確保我沒有錯過另一個半明顯的事情。如果您編寫檢查點示例,我會很高興看到它,但手動執行相當容易。 – Backlin