2017-01-20 57 views
0

嗯,我不認爲有人能夠理解這個問題...R foreach doParallel with 1 worker/thread

我有一個動態腳本。有時候,它會遍歷10個事物的列表,有時它只會遍歷1個事物。

我想使用foreach並行運行腳本,當迭代的項目大於1時。我只是想使用每個項目1個核心來迭代。所以,如果有5件事情,我會平行跨越5個線程。

我的問題是,當迭代的列表是1時會發生什麼?

是不是更好地不平行運行並使機器的吞吐量最大化?或者我可以讓我的腳本分配1個工作人員,它會運行相同,就好像我沒有告訴它並行運行一樣?

回答

1

所以,讓我們致電iter您可以動態地設置爲不同進程

「的事情你迭代次數」

腳本的並行化可能是這個樣子

if(length(iter)==1){ 
    Result <- #some function 
} else { 
    cl <- makeCluster(iter) 
    registerDoParallel(cl) 
    Result <- foreach(z=1:iter) %dopar% { 
    # some function 
    } 
    stopCluster(cl) 
} 

這裏如果iter爲1它不會調用並行操作,否則會根據iter的數量動態分配內核。請注意,如果您打算將其嵌入函數中,則不能在函數內調用makeClusterregisterDoParallel,您必須將它們設置在函數外部。

或者,您可以像有節點一樣註冊許多羣集,動態運行foreach並且未使用的羣集將保持空閒狀態。

編輯:如果您只有一個操作來遍歷,最好運行NOT並行運行。如果只是爲了避免由makeCluster(),registerDoParallel()stopCluster()產生的額外時間。但與一名工人並行相比,這種差異會很小。修改上面的代碼,添加條件來屏蔽只有一個工人的情況。如果您需要進一步的幫助,請提供反饋信息。

+0

我編輯了OP –

+0

回覆編輯相應 – JustGettinStarted

+0

如果您對答案滿意,請點擊勾號來標記此問題現在已關閉 – JustGettinStarted