2012-05-21 20 views
6

Paralel paketleri kullanmakta yeniyim ve bazı çalışmalarımı hızlandırmak için bir teklifte keşfetmeye başladım. Sıklıkla karşılaştığım bir sıkıntı, clusterExport ilgili işlevler/değişkenler olmadığında foreach komutunun kusacağını gösteriyor.Önceden hangi nesnelere clusterExport kullanabileceğinizi bilmek

Örnek

Ben örnek aşağıda mutlaka hızlı hale getirmek için foreach ihtiyacı olmadığını biliyorum ama illüstrasyon uğruna, bunu kullanacağız. Gördüğünüz gibi

library(doParallel) 
library(parallel) 
library(lubridate) 
library(foreach) 

cl <- makeCluster(c("localhost", "localhost", "localhost","localhost"), type = "SOCK") 
registerDoParallel(cl, cores = 4) 

Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 500, replace = TRUE) 

foreach(i = seq_along(Dates), .combine = rbind) %dopar% dmy(Dates[i]) 

Error in dmy(Dates[i]) : task 1 failed - "could not find function "dmy"" 

, dmy fonksiyonu bulunmazsa bildiren bir hata var. Sonra aşağıdaki gidip eklemek zorunda:

clusterExport(cl, c("dmy")) 

Benim soru, ihracat ne ipuçları hata bakarak yanı sıra ihracat nesneleri veya önceden bilmenin daha şık bir yolu yoktur edilir foreach'u çalıştırmadan önce küresel ortamı tüm kölelerle paylaşmanın bir yolu var mı? Tek bir paket işlevini bu şekilde el ile dışa aktarmaya gerek yoktur.

+0

Bunun için bir '.packages' argümanı var. –

+0

Detaylandırmaya bakar mısınız? Denedim (.packages()) ve ekli paketler listelendi. Ama bir paketin tüm nesnelerini nasıl ihraç edebilirim? Ben clusterExport (cl, c ("kitaplık (lubridate)")) ve clusterExport (cl, c ("lubridate")) hiçbir boşuna – JackeJR

+0

denedim Üzgünüm, ".packages" foreach "," değil .packages işlevi. –

cevap

2

Gerekli paketleri yüklemek için foreach işlevine .packages bağımsız değişkenini kullanabilirsiniz, böylece tüm paket işlevleri %dopar% ifadenizde kullanılabilir olacaktır.

+1

Bu, 2.14.0'daki yeni paralel kitaplık için çalışır, ör. parLapply? Benzer bir sorun yaşıyorum. –

+2

@ mindless.panda: Her küme düğümünde paketleri yüklemek için 'clusterEvalQ (cl, library (packageName))' türünü kullanabilmeniz gerekir. –

+0

Teşekkürler, ben de parLapply içinde anonim işlev içinde bir 'kitaplık (packagename)' yerleştirdim. –

İlgili konular