2015-06-11 25 views
4

我在並行運行一些嵌套的foreach循環時遇到了一些麻煩。這裏的情況:R嵌套的Foreach並行化不起作用

這個程序基本上使用不同數量的觀察和不同的統計顯着性水平進行假設檢驗。我有四個嵌套的foreach循環。項目data.structures是執行測試的矩陣的列表。 data.structures有兩個不同的列表。一個列表包含243個矩陣(小列表),另一個列表包含19,683個(大列表)。

number.observations = c(50,100,250,500,1000) 
significance.levels = c(.001,.01,.05,.1,.15) 

require(foreach) 
require(doParallel) 

cl = makeCluster(detectCores()) 
registerDoParallel(cl) 
results = foreach(data=data.structures,.inorder=FALSE,.combine='rbind') %:% 
    foreach(iter=1:iterations,.inorder=FALSE,.combine='rbind') %:% 
    foreach(number.observations=observations,.inorder=FALSE,.combine='rbind') %:% 
    foreach(alpha=significance.levels,.inorder=FALSE,.combine='rbind') %dopar% { 
    #SOME FUNCTIONS HERE 
} 

當我使用矩陣的小名單data.structures,我可以看到所有的內核被充分利用(100%的CPU使用率)在Windows的資源監視器與每組六個線程八道工序,作業按預期在更短的時間內完成。但是,當我更改爲更大的矩陣列表時,將啓動這些過程,並可以在資源監視器的「進程」部分中看到。八個進程中的每一個都顯示三個線程,每個線程都沒有CPU動作。總CPU使用率約爲12%。

我剛剛與R並行化。即使我簡化了問題和功能,我仍然只能夠讓程序與小列表並行運行。從我自己的閱讀中,我想知道這是否是工作量分配的問題。我已經包含了.inorder = FALSE選項來嘗試解決這個問題,但無濟於事。我相當肯定,這個程序是並行化的好選擇,因爲它執行數十萬次相同的任務,並且循環不依賴於以前的值。

任何幫助非常感謝!

+0

我懷疑你的內存不足,而且你的機器壞了。資源監視器是否告訴你使用了多少內存? –

+0

感謝您的建議,@SteveWeston我打開資源監視器並重新執行程序,內存使用量在前幾分鐘內僅佔物理內存的21%。在未來的某個時刻,內存是否會耗盡我還沒有達到的程度,但系統已經受到了影響? – Alex

+0

我期望主控制器上的內存使用量能夠在循環過程中增加,但如果你只使用了21%的內存,那聽起來不像內存問題。我會考慮一下,但如果你能提供一個可重複的例子,這將會有所幫助。 –

回答

0

類似的問題也發生在我的代碼中。

y= foreach(a= seq(1,500,1),.combine='rbind') %:% 
    foreach(b = seq(1,10,1), .combine='rbind') %:% 
    foreach(c = seq(1,20,1), .combine='rbind') %:% 
    foreach (d = seq(1,50,1), .combine='rbind') %do% { 
     data.frame(a,b,c,d) 
    } 

一個非常簡單的嵌套的foreach並行循環,它可以執行,但不是並行風格。