3

viaとplot を生成し、作業ディレクトリに保存するforループがあります。png()dev.off()

私が持っているループは次の例に似ています

test.df<-data.frame(id=1:25000, x=rnorm(25000),y=rnorm(25000))

for (i in test.df$id){
  plot(test.df$x[test.df$id==i], test.df$y[test.df$id==i], xlab="chi",ylab="psi")
}

forループが実行され、何千ものプロットが生成されます。プロットを高速化できるように、システムの 8 つのコアすべてで並列に実行することはできますか?

PS。コードは一です。私の元の問題とプロットははるかに複雑です。例でバイラルにならないでください。

4

3 に答える 3

6

R の新しいバージョンを使用している場合、これは簡単です。秘訣は、任意のコアで任意の順序で実行できる関数を作成することです。まず、データ フレームを作成します。

test.df = data.frame(id=1:250, x=rnorm(250),y=rnorm(250))

次に、各コアで実行される関数を作成します。

#I could also pass the row or the entire data frame
myplot = function(id) {
  fname = paste0("/tmp/plot", id, ".png")
  png(fname)
  plot(test.df$x[id], test.df$y[id], 
      xlab="chi",ylab="psi")
  dev.off()
  return(fname)
}

次に、パッケージをロードしparallelます (これはベース R に付属しています)

library(parallel)

そして使用するmclapply

no_of_cores = 8
##Non windows
mclapply(1:nrow(test.df), myplot, 
         mc.cores = no_of_cores)

##All OS's
cl = makeCluster(no_of_cores)
clusterExport(cl, "test.df")
parSapply(cl, 1:nrow(test.df), myplot)
stopCluster(cl)

ここには 2 つの利点があります。

  1. パッケージparallelにはRが付属しているため、余分なものをインストールする必要はありません
  2. 「並列」部分をオフにできます。

    sapply(1:nrow(test.df), myplot)
    
于 2013-01-27T19:19:05.170 に答える
5

パッケージを使用foreachすると、コア コードを最小限に変更する必要があります。また、OS やその他の問題に関して任意のバックエンドを選択できます。

##
## Working dir and data generation
##
setwd("/path/to")
N <- 25000
test.df<-data.frame(id=1:N, x=rnorm(N),y=rnorm(N))

##
## Making a cluster
##
require(doSNOW) # Or any other backend of your choice
NC <- 8         # Number of nodes in cluster, i.e. cores
cl <- makeCluster(rep("localhost", NC), type="SOCK")
registerDoSNOW(cl)

## 
## Core loop
##
foreach(i=1:N) %dopar% {
  png(paste("plot",i,".png",sep=""))
  plot(test.df$x[test.df$id==i], test.df$y[test.df$id==i], xlab="chi",ylab="psi")
  dev.off()
}

##
## Stop cluster
##
stopCluster(cl)

%dopar%1 つのコアを使用するのは簡単%do%です。

于 2013-01-27T19:20:08.650 に答える
3

Windowsではサポートされていないため、パッケージmclapplyを使用してWindowsユーザー向けのソリューションを提供します。parallel

cl <- makeCluster(8)
parSapply(cl, 1:20, fun, fun.args)
于 2013-01-27T19:41:00.213 に答える