web-dev-qa-db-ja.com

Windowsでrを並列化する方法-例

Windowsのrで動作するコードの並列化を取得するにはどうすればよいですか?簡単な例を含めます。この自己回答の質問を投稿することは、これが仕事を始めるのがかなり不愉快だったためです。パッケージパラレルは単独では機能しませんが、パッケージスノーは非常にうまく機能します。

23
Carbon

これを投稿すると、私は永遠に血まみれになったからです。以下に、rでの並列化の簡単な例を示します。これにより、物事が適切に機能しているかどうかをテストし、正しい道に進むことができます。

_library(snow)
z=vector('list',4)
z=1:4
system.time(lapply(z,function(x) Sys.sleep(1)))
cl<-makeCluster(###YOUR NUMBER OF CORES GOES HERE ###,type="SOCK")
system.time(clusterApply(cl, z,function(x) Sys.sleep(1)))
stopCluster(cl)
_

また、ライブラリdoSNOWを使用してforeachをsnowクラスターに登録する必要があります。これにより、多くのパッケージが自動的に並列化されます。登録するコマンドはregisterDoSNOW(cl)makeCluster()からの戻り値であるcl)で、登録を取り消すコマンドはregisterDoSEQ()です。クラスターをオフにすることを忘れないでください。

31
Carbon

これは私のために働いた、私はパッケージdoParallelを使用し、3行のコードが必要でした:

# process in parallel
library(doParallel) 
cl <- makeCluster(detectCores(), type='PSOCK')
registerDoParallel(cl)

# turn parallel processing off and run sequentially again:
registerDoSEQ()

ランダムフォレストの計算は、180秒から120秒に減少しました(4コアのWindowsコンピューター上)。

12

これらのライブラリはあなたを助けると思います:

foreach (facilitates executing the loop in parallel)
doSNOW (I think you already use it)
doMC (multicore functionality of the parallel package)

これらの記事があなたの役に立つことを願っています

http://vikparuchuri.com/blog/parallel-r-loops-for-windows-and-linux/

http://www.joyofdata.de/blog/parallel-computing-r-windows-using-dosnow-foreach/

4
rischan

情報に基づいて here 次のコードをWindows 7のR Studioで動作する並列バージョンに変換することができました。

元のコード:

#
# Basic elbow plot function
#
wssplot <- function(data, nc=20, seed=1234){
    wss <- (nrow(data)-1)*sum(apply(data,2,var))
    for (i in 2:nc){
        set.seed(seed)
        wss[i] <- sum(kmeans(data, centers=i, iter.max=30)$withinss)}
    plot(1:nc, wss, type="b", xlab="Number of clusters", 
       ylab="Within groups sum of squares")
}

並列化されたコード:

library("parallel")

workerFunc <- function(nc) {
  set.seed(1234)
  return(sum(kmeans(my_data_frame, centers=nc, iter.max=30)$withinss)) }

num_cores <- detectCores()
cl <- makeCluster(num_cores)
clusterExport(cl, varlist=c("my_data_frame")) 
values <- 1:20 # this represents the "nc" variable in the wssplot function
system.time(
  result <- parLapply(cl, values, workerFunc) )  # paralel execution, with time wrapper
stopCluster(cl)
plot(values, unlist(result), type="b", xlab="Number of clusters", ylab="Within groups sum of squares")

それが完璧であることや最高であることを示唆するのではなく、Windowsで並列が機能するように見えることを示す初心者です。それが役に立てば幸い。

4
Mark

私が見つけた他のすべての答えは、私が達成する必要があるために過度に複雑だったので、私はここにクロスプラットフォームの答えを投稿しています。 Excelブックのすべてのシートを読んでいる例を使用しています。

# read in the spreadsheet 
parallel_read <- function(file){

    # detect available cores and use 70%
    numCores  = round(parallel::detectCores() * .70)

    # check if os is windows and use parLapply
    if(.Platform$OS.type == "windows") {

        cl <- makePSOCKcluster(numCores)
        parLapply(cl, file, readxl::read_Excel)
        stopCluster(cl)

        return(dfs)

    # if not Windows use mclapply
    } else {

        dfs <-parallel::mclapply(Excel_sheets(file), 
                         readxl::read_Excel, 
                         path = file,
                         mc.cores=numCores)

        return(dfs)

   }
}
0
SummerEla