2011-07-14 26 views
18

denilen işlev içinde foreach% dopar% sorun Foreach% dopar Optim konstruktun bir hataya neden olur:%R - içeren bir işlevinin çağrılması optim

> workers <- startWorkers(6) # 6 cores 
> 
> registerDoSMP(workers) 
> 
> t0 <- Sys.time() 
> 
> optim(w,maxProb2,control=list(fnscale=-1)) 
> 
> Error in { : task 1 failed - "unused argument(s) (isPrebuilt = TRUE)" 
> 
> Sys.time()-t0 
> 
> Time difference of 2.032 secs 
> 
> stopWorkers(workers) 

adlandırılan fonksiyonu gibi görünüyor:

> maxProb2 <- function(wp) { 
> 
> r <- foreach (i=s0:s1, .combine=c) %dopar% { pf(i,x[i,5],wp,isPrebuilt=TRUE) } 
> 
> cat("w=",wp,"max=",sum(r),"\n") 
> 
> sum(r) 
> 
> } 

pf, başka bir işlevdir, x, önceden hesaplanmış öğelerin statik bir tablosudur. işlevini çağırarak Ayrıca

sadece bir kez optimize aynı hataya neden olmak:

garip Ne
> workers <- startWorkers(6) # 6 cores 
> 
> Warning message: 
> In startWorkers(6) : there is an existing doSMP session using doSMP1 
> 
> registerDoSMP(workers) 
> 
> maxProb2(w) 
> Error in { : task 1 failed - "unused argument(s) (isPrebuilt = TRUE)" 
> 
> stopWorkers(workers) 

aynı kod tek bir zaman (Optim aynı işlevi calles birçok kez) doğrudan aradığında çalışıyor:

> workers <- startWorkers(6) # 6 - ilosc rdzeni 
> 
> Warning message: 
> In startWorkers(6) : there is an existing doSMP session using doSMP1 
> 
> registerDoSMP(workers) 
> 
> r <- foreach (i=s0:s1, .combine=c) %dopar% { pf(i,x[i,5],w,isPrebuilt=TRUE) } 
> 
> sum(r) 
> [1] 187.1781 
> 
> stopWorkers(workers) 

Çağrılan işlev (maxProb2),% dopar% yerine% do% kullanıldığında iyi çalışır.

Foreach% dopar% construction dahil olmak üzere bir işlevi nasıl doğru şekilde çağırabilirim?

GÜNCELLEME 2011-07-17:

Ben probf içine pf fonksiyonunu yeniden adlandırmış ama sorun olmaya devam etmektedir.

prob fonksiyonları bazı dış paketlerde değil betikte tanımlanmıştır.

İki not: İşletim Sistemi: Windows 7, IDE: Devrim Analitik Kurumsal 4,3

> workers <- startWorkers(workerCount = 3) 
> 
> registerDoSMP(workers) 
> 
> maxProb2(w) 
> 
Error in { : task 1 failed - "could not find function "probf"" 
+0

Lütfen her zaman sorunuza tam olarak hata mesajını ekleyin. –

cevap

2

[[Düzenlendi]]

Sizin pf fonksiyon ve "statik tablo" x tüm işçiye dağıtılmalıdır düğümler. Paralel kitaplığınızın belgelerinin nasıl çalıştığını okumalısınız.

Optim ile çalıştırdığınızda, bulduğu pf fonksiyonu (bir isPrebuilt argüman yoktur muhtemelen stats::pf,) başka bir olduğunu gibi görünüyor.

pf işlevini yeniden adlandırmayı deneyebilir misiniz (örneğin, mypf)?

mypf <- pf # renaming the function 

maxProb2 <- function(wp) { 
    r <- foreach (i=s0:s1, .combine=c) %dopar% { mypf(i,x[i,5],wp,isPrebuilt=TRUE) } 
    cat("w=",wp,"max=",sum(r),"\n") 
    sum(r) 
} 

Veya, pf işlevi ad (diyelim ki, mypackage), bunu şöyle başvuru olabilir ile bir paketin parçası ise: mypackage::pf

maxProb2 <- function(wp) { 
    r <- foreach (i=s0:s1, .combine=c) %dopar% { mypackage::pf(i,x[i,5],wp,isPrebuilt=TRUE) } 
    cat("w=",wp,"max=",sum(r),"\n") 
    sum(r) 
} 
+0

Nasıl çağıran işlev ve tablonun çalışan düğümlerine dağıtıldığından emin oluyorum? – mjaniec

+1

'pf', yerleşik' stats' paketinde bulunur ve F dağılımı için dağıtım işlevidir. – James

+0

Yanıtı güncellediğimden beri güncelledim - yanlış 'pf' işlevi denir. – Tommy

18

Ben aynı sorun koştu bir Sorun, alt konulara dahil edilmeyen ortamdır.Sizin hata

Error in { : task 1 failed - "could not find function "simple_fn""

bu çok basit örnekle çoğaltılabilir:

simple_fn <- function(x) 
    x+1 

test_par <- function(){ 
    library("parallel") 
    no_cores <- detectCores() 
    library("foreach") 
    cl<-makeCluster(no_cores) 
    library("doSNOW") 
    registerDoSNOW(cl) 
    out <- foreach(i=1:10) %dopar% { 
     simple_fn(i) 
    } 

    stopCluster(cl) 
    return(out) 
} 

test_par() 

Şimdi tüm foreach(i=1:10, .export=c("simple_fn")) içine foreach(i=1:10) değiştirmektir için gerekir. Eğer tüm global ortamınızı dışa aktarmak istiyorsanız, o zaman sadece .export=ls(envir=globalenv()) yazınız ve daha iyisi ya da daha kötüsü olacaksınız. Bu Bunların eski sürümlerinde varolan R. Bug paralellik sorumludur StackOverflow'daki çeşitli iplikler de belirtildiği gibi

install.packages("doSNOW") 

install.packages("doParallel") 

install.packages("doMPI") 

: foreach% dopar% ile sorun için

+1

Neden her zaman merak ettim .export = ls() 'varsayılan değil. Çoğu durumda, bu konudaki yayınların sayısından yola çıkarak iyi bir fikir gibi görünüyor ... Herhangi bir fikir? – Ruben

+1

@Ruben - büyük parantezler –

+1

ile çalışırken en önemli paralellik olduğu için mantıklıdır. Fakat daha sonra her düğümde ayrı ayrı veri parçaları yüklersiniz, değil mi? Bütün df'yi küresel oturumda o zaman yüklemem. Ve bazı şeyler otomatik olarak yüklenir (örneğin, üzerinde yinelediğiniz vektörler). Üstelik, ls kullanarak şimdi beklediğim gibi çalışmadı. Olmayı tahmin ettiğim şeyi güvenilir şekilde aldığım tek çözüm, döngü içinde tanımlamaktır. Verimsiz, bazen çirkin olsa da. – Ruben

0

Hızlı çözüm bu paketleri yeniden yüklemektir paketler kaldırıldı. Benim durumumda çalıştı. Bu paketleri projenizde/paketinizde kullanmamanıza rağmen büyük olasılıkla yardımcı olacağını belirtmeliyim.

İlgili konular