2011-04-01 72 views
9

我在Windows 7中使用doSMP作爲並行後端,R 2.12.2。我遇到了一個錯誤,並想了解可能的原因。以下是一些重現錯誤的示例代碼。R中並行R執行問題

require(foreach) 
require(doSMP) 
require(data.table) 
wrk <- startWorkers(workerCount = 2) 
registerDoSMP(wrk) 
DF = data.table(x=c("b","b","b","a","a"),v=rnorm(5)) 
setkey(DF,x) 
foreach(i=1:2) %dopar% { 
    DF[J("a"),] 
} 

的錯誤消息是

Error in { : task 1 failed - "could not find function "J"" 
+0

我會問顯而易見的Q - 什麼是J()我運行你的代碼,並得到相同的錯誤在一個Linux框與R 2.13-0 -alpha,我無法在該系統的任何地方找到'J()'。 – 2011-04-01 13:03:33

+0

這與Gavin的問題是一樣的,但是當你調用DF [J(「a」),]時,什麼是J? – 2011-04-01 13:11:38

+0

啊,忽略這一點,我發現DF [J(「a」),]不在'foreach()'包裝中時工作,所以它必須是data.table特有的東西。將調查更多。 – 2011-04-01 13:16:25

回答

7

OK,我問革命計算,和史蒂夫·韋勒(RC的)回答:

的問題是對R範圍界定問題。默認情況下,foreach()將查找 定義在其自己的 'environment'中的變量。任何定義在 範圍之外的對象都必須是 ,通過 '.export'參數顯式傳遞給它。

在你的情況,你將需要修改 你'的foreach()調用的 對象 'DF' 通過和 'J':

... 

foreach(i=1:2, .export=c("DF","J")) %dopar% { 
... 

我還沒有嘗試過任何解決方案,但我相信JD和RC ...

+0

我不認爲你需要''DF「'在那裏。如果我使用你的行,我會得到一個警告:'已經輸出變量:DF'如果你省略'「DF」',它會在沒有警告的情況下運行。 – 2011-04-01 14:50:38

+0

因爲你的foreach循環需要使用'data.table'包,所以你應該使用'.packages',就像在@JD Long的答案中一樣,然後不需要導出。出口也可能會損害您的表現,因爲我相信它會將整個包裹與功能一起連續化。加載軟件包是將功能「導出」到工作人員的最佳方式。 – 2013-04-21 12:28:58

8

我沒有用doSMP,但我做了一些周圍挖掘,它看起來像this post獲得在類似的問題。

所以看起來你應該能夠做到:

foreach(i=1:2, .packages="data.table") %dopar% { 
    DF[J("a"),] 
} 

我無法測試,因爲我沒有一個Windows機器方便。

+0

在我的編輯之後,這對我的@JD適用於我的linus框。 +1 – 2011-04-01 13:42:30

+0

感謝您的收穫! – 2011-04-01 14:49:06