Windowsのrで動作するコードの並列化を取得するにはどうすればよいですか?簡単な例を含めます。この自己回答の質問を投稿することは、これが仕事を始めるのがかなり不愉快だったためです。パッケージパラレルは単独では機能しませんが、パッケージスノーは非常にうまく機能します。
これを投稿すると、私は永遠に血まみれになったからです。以下に、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()
です。クラスターをオフにすることを忘れないでください。
これは私のために働いた、私はパッケージ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コンピューター上)。
これらのライブラリはあなたを助けると思います:
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/
情報に基づいて 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で並列が機能するように見えることを示す初心者です。それが役に立てば幸い。
私が見つけた他のすべての答えは、私が達成する必要があるために過度に複雑だったので、私はここにクロスプラットフォームの答えを投稿しています。 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)
}
}