2

コードの開始時に供給される複数のユーザー定義関数で構成される非常に長いコードがあります。スクリプト全体はforループ内にあり、csv ファイルを 1 つずつ読み取り、それらを分析し、反復ごとに 2 つの csv ファイルと PNG を出力します。平均して、コードはファイルごとに約 18 秒かかり、通常、一度に分析されるファイルは約 150/200 です。

これには時間がかかるので、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 に、これは以前にループの外でロードされたソース コード ファイルが使用できないことを意味するのでしょうか? つまり、私のユーザー定義関数ですか?

ポイントを見逃しているかもしれませんが、まだ理解していない、これを行うためのより簡単な方法があると思います。アドバイスをいただければ幸いです。

4

2 に答える 2

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
}
于 2016-04-11T11:12:57.553 に答える