2016-04-11 29 views
2

ile R'de multicores kullanarak döngü için Kodumun başlangıcında çok sayıda kullanıcı tanımlı fonksiyondan oluşan çok uzun bir kod parçam var. Komut dosyası, csv dosyalarını tek tek okuyan, analiz eden ve 2 csv dosyası ve yineleme başına bir PNG olan bir for döngüsündedir. Ortalama olarak, kod, dosya başına yaklaşık 18 saniye sürer ve bir seferde analiz edilmek üzere normal olarak 150/200 dosya vardır.Foreach

Bu, uzun bir zaman alır, bu nedenle bilgisayarımdaki 8 çekirdekten yararlanmak istiyorum.

foreach ana for döngüsümü değiştirdim ve %dopar% ekledim, ancak kodum çalışmıyor.

bir örnek gösterilmiştir:

cl=makeCluster(8) 
registerDoParallel(cl) 

library(parallel) 
library(foreach) 
library(ggplot2) 
library(data.table) 

foreach(kk=1:2) %dopar% { 
    Data=rnorm(60000,3,kk) 
    Date=seq(as.POSIXct("2014-01-01 00:00:00"), length.out=60000, by="15 mins") 
    DF=data.frame(Date,Data) 

    DF$MeanDiff=sapply(DF$Data, function(x) abs(x-mean(DF$Data))) 

    write.csv(data.table(DF), file="Data with difference from mean.csv", row.names=F) 

    DF$Colour=c(rep("Pink",30000),rep("Blue",30000)) 

    file_name_data = "Test plot.jpg" 
    png(filename=file_name_data,width=900,height=600,res=80) 
    print(ggplot(DF, aes(Date, Data,colour=Colour, group=1))+geom_line()+geom_point()+ 
      scale_x_datetime(limits=c(as.POSIXct(Date[1]), as.POSIXct(Date[length(Date)])), labels = date_format("%d-%m-%y"))) 
    dev.off() 
} 

Sorun diğer yüklenen paketleri foreach döngüsünde kullanılacak mümkün değildir olduğunu düşünmektedirler. Eğer durum buysa, bunu nasıl düzeltirim? İkincisi, bu aynı zamanda, döngü dışında yüklenen herhangi bir kaynak kod dosyasının kullanılamayacağı anlamına mı geliyor? yani kullanıcı tanımlı işlevlerim?

Bu noktayı kaçırıyor olabilirim, ama daha önce yakalamadığım daha kolay bir yol olduğunu hayal ediyorum. Herhangi bir tavsiye takdir edilecektir.

cevap

1
library(doParallel) 
library(foreach) 

cl <- 4 
registerDoParallel(cl) 

foreach(kk=1:2)%dopar%{ 
    library(ggplot2) 
    library(data.table) 
    #your code 
} 

Sadece bir süre önce foreach kullanarak başladı, bu nedenle bu söyleyerek ben yanlış olabilir, ama bu şimdiye kadar bunu anlamak nasıl. ForParallel ile foreach kullandığınızda, her bir örnek için kitaplıklarınızı yeniden yüklemenizi gerektiren yeni bir R örneği oluşturur. Ayrıca, foreach öncesinde daha önce çalışma alanına yüklenen ve daha sonra foreach döngüsünde çağrılan her şey yeni örneklere taşınacaktır.

0
library(parallel) 
library(foreach) 
library(doSNOW) 

cl <- makeCluster(8) #8 is the number of cores 
registerDoSNOW(cl) 

foreach(kk=1:2) %dopar% { 
#your code 
} 
+0

Bunu denedim, (ancak zaman içinde kodumu güncellememiştim), ama yine de aynı sorunu yaşıyorum .. – sym246