2014-04-15 39 views
5

Hesaplamak çok uzun süren bir kod çalıştırıyorum. Kodumu foreach()%dopar% kullanarak paralel yaptım ve kümede çalışıyorum.Nadir geri izleme Hata

Genellikle iyi çalışır ama bazen çöker ve aşağıdaki hatayı alıyorum: Artık Error in { : task 4 failed - "missing value where TRUE/FALSE needed" Calls: %dopar% -> <Anonymous> Execution halted

diyor Yürütme ama sadece başkalarının çalışan ve sonunda onu çıkışa başarısız ama gelmez devam böylece bu özel çekirdek için durdurdu Bana daha önce söylemedin. Sanırım bir if bildirimi ile ilgili bir sorun var. Kodu bilgisayarımda simüle etmeye çalıştım ama simüle edemediğim çok nadir.

Kod 100 000 döngüde 100 saatte kolayca çalışır ve bunlardan yalnızca biri başarısız olur.

Sorularım şunlardır: Hatanın nerede olduğunu gözden geçirebilir miyim? (Bir küme üzerinde kodu çalıştırıyorum böylece tüm güzel Rstudio öğelerine sahip değilim)
Ayrıca, görevlerden biri çökmüş olsa bile foreach() döngüsünden çıktı almak mümkün mü?
Ya da insanlar benim bilgisayarımda kilitlenme yapmak için kullanabileceğiniz herhangi bir yöntem kullanabilir?

Gerekirse kodu yazabilirim, lütfen yardımcı olup olmadığını sorun.

+0

Bilginizi bir try() içinde sarın. O zaman tüm sonuçları elde edebilecek ve sorunu araştırabileceksiniz. –

+0

@KarlForner: Yapmaya çalışıyorum gibi görünmüyor. Sadece benim kodumda 'Beklenmedik semboller' hakkında şikayette bulunur ... Kullanmak için özel bir yol var mı? Ben hiç aşina değilim. – TAllieri

+1

'try' veya' trycatch' iyi bir öneridir. Diğer bir olasılık da, her paralel çağrıda kullanılan * girişin * (j-th veri alt kümesinin) günlüğe kaydedilmesidir, böylece soruna neden olan veri parçasını daraltabilirsiniz. Bu arada, fonksiyonunuzda doğrulama kodu bulunduğundan emin olun; örneğin, 'length (bir şey)> 0' ve '! Is.na (bir şey)' 'in' TRUE'' olup olmadığını kontrol etmeden önce (eğer) . –

cevap

3

Foreach ".errorhandling" argümanının bu durumda yardımcı olması amaçlanmıştır. Foreach'ın hataları iletmesini istiyorsanız, 'u kullanın. Hataları filtrelemek istiyorsanız (sonucun uzunluğunu azaltır), ardından .errorhandling="remove" kullanın. Varsayılan değer, hangi görevin başarısız olduğunu belirten bir hata veren "durdur" dur.

Maalesef, çoğu paralel arka tarafın izleri desteklemiyor, ancak doMPI var. Yalnızca "startMPIcluster" öğesini verbose=TRUE ile çağırırsınız ve traceback, hataya sahip işçinin günlük dosyasına yazılır.

suppressMessages(library(doMPI)) 
cl <- startMPIcluster(4, verbose=TRUE) 
registerDoMPI(cl) 
g <- function(i) { 
    if (i == 42) { 
    if (NULL) cat('hello, world\n') 
    } 
    7 
} 
f <- function(i) g(i) 
r <- foreach(i=1:50, .errorhandling='pass') %dopar% f(i) 
print(r) 
closeCluster(cl) 
mpi.quit() 

o .errorhandling="pass" kullandığından bir hata nesnesi sonuç listesinin elemanı 42 iade ile, senaryo, tamamlanma çalıştırır: Burada görev 42 bir hata üretir bir örnek. Buna ek olarak, günlük dosyalarından biri yanılma Traceback (birçok diğer mesajları ile birlikte) içerir:

waiting for a taskchunk... 
executing taskchunk 42 containing 1 tasks 
error executing task: argument is of length zero 
traceback (most recent call first): 
> g(i) 
> f(i) 
> eval(expr, envir, enclos) 
> eval(expr, envir) 
> executeTask(taskchunk$argslist[[1]]) 
> executeTaskChunk(cl$workerid, taskchunk, envir, err, cores) 
returning error results for taskchunk 42 

Maalesef doMPI çoğunlukla Linux sistemlerinde kullanılır, bu nedenle bu en Mac ve Windows için yararlı değildir kullanıcılar.

+0

teşekkürler yerine <- try (compute_stuff (args)) yapın. ForMPI'yi foreach yerine başlangıçta kullanmayı denedim, maalesef linux kümesi onu yükleyemiyor. Yöneticiye bunu birkaç ay önce yapmasını istedim ama cevap vermedim :-(''.errorhandling =" pass "' cevap yerine NA'yı koyun ve devam etmeyi sürdürürüm. Bunu bir deneyeceğim ama hata çok Rastgele ve nadir, bu yüzden birkaç gün içinde geri gelebilir. – TAllieri

+0

Rmpi ​​ile kafam karışmamış mıyım? Yüklemeyi denediğimde aldığım hata bu https://stat.ethz.ch/pipermail/r-sig-hpc/2011-May/000977.html – TAllieri

+0

@TAllieri Bir hata nesnesinin döndüğünü söyleyen cevabı güncelledim Sonuç listesinde .errorhandling = "pass" kullanılır. –

İlgili konular