2016-04-11 6 views
2

私は、コードの始めにソースとなる複数のユーザー定義関数で構成された非常に長いコードを持っています。スクリプト全体はforループ内にあり、csvファイルを1つずつ読み込んで解析し、繰り返しごとに2つのcsvファイルとPNGを出力します。平均して、コードはファイルあたり約18秒かかっており、通常は1回の分析で約150/200のファイルが解析されます。foreachでRでマルチコアを使用するループ

これは時間がかかりますので、私のPC上の8つのコアを利用したいと思います。

メインのforループをforeachに変更し、%dopar%を追加しましたが、私のコードは機能しません。

例が示されています:

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() 
} 

私は問題は、他のロードされたパッケージがforeachループで使用することができないということであると信じています。この場合、どうすればこの問題を解決できますか?第2に、ループの外に以前にロードされたソースコードファイルを使用できないことを意味しますか?すなわち私のユーザ定義関数?

私はその点を見逃しているかもしれませんが、これを行う簡単な方法はまだありません。アドバイスをいただければ幸いです。

答えて

1
library(doParallel) 
library(foreach) 

cl <- 4 
registerDoParallel(cl) 

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

私はしばらく前のforeachを使用して開始したので、これを言ったとき、私は間違っているかもしれないが、これは私がこれまでにそれを理解する方法です。 doParallelでforeachを使用すると、新しいRインスタンスが作成されます。このため、インスタンスごとにライブラリを再ロードする必要があります。また、foreachループが呼び出される前に以前にワークスペースにロードされていたものと、その後foreachループで呼び出されるものは、新しいインスタンスに引き継がれます。

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

私はこれを試しました(ただし、私のコードを時間通りに更新していませんでした)が、私はまだ同じ問題を抱えています。 – sym246

関連する問題