2011-04-01 40 views
9

DoSMP'yi Windows 7'de R 2.12.2 ile paralel bir arka uç olarak kullanıyorum. Bir hata yaptım ve olası sebebi anlamak istiyorum. Hatayı yeniden oluşturmak için bazı örnek kodlar.paralel R yürütme sorunu 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"),] 
} 

hata mesajı doSMP kullanılmaz ettik

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

Açık olanı soracağım Q - ne 'J()' Kodunuzu çalıştırdım ve aynı hatayı bir Linux kutusuna aldım R 2.13-0 -alpha ve bu sistemde herhangi bir yerde J() 'yi bulamıyorum. –

+0

bu, Gavin'le aynı sorudur, fakat “DF [J (” a ”),“ J ”dediğinizde? –

+0

Ah, bunu görmezden gelerek, DF [J ("a"),] 'nin foreach() 'paketleyicisinde değilken çalışacağını görüyorum, bu yüzden data.table'a özel bir şey olmalı. Daha fazla araştırır. –

cevap

7

Tamam, Devrim bilgisayar istedi ve (RC) Steve Weller cevap verdi:

problem R kapsam konudur. varsayılan olarak foreach(), kendi 'çevre' içinde tanımlanan değişkenlerini arayacaktır. Bu kapsamın dışında olarak tanımlanmış herhangi bir nesne, adresine '.export' argümanı üzerinden açıkça geçirilmelidir. Ben de denemedim

... 

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

:

Senin durumunda

, sen değiştirmek için 'foreach()' nesnelerin df 'geçmek arayıp 'J' gerekecektir çözüm henüz, ama hem JD hem de RC'ye güveniyorum.

+0

Orada "DF" 'ye ihtiyacın olduğunu sanmıyorum. Eğer satırınızı kullanırsam bir uyarı alırım: 'zaten değişken (ler) leri dışa aktarıyor: DF' '' DF '' dışına çıkarsanız uyarı yapmadan çalışır. –

+0

Foreach döngüsünüz 'data.table' paketini kullanması gerektiğinden, @JD Long'un cevabında olduğu gibi' .packages 'kullanılmalı ve daha sonra dışa aktarma gerekli değildir. İhracat, tüm paketin işlevle birlikte serileştirileceğine inandığından performansınızı da olumsuz yönde etkileyebilir. Bir paket yüklemek, işçilere fonksiyonları "dışa aktarmanın" en iyi yoludur. –

8

, ama bazı etrafında kazma ve this post benzer konusu olur gibi görünüyor yaptı.

yüzden yapmanız gerekir gibi görünüyor:

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

Ben kullanışlı bir Windows makine yok gibi ben test edemezsiniz.

+0

Bu benim linus kutumda @JD için çalışıyor - benim düzenlemeden sonra. +1 –

+0

Av için teşekkürler! –