私は、ロックオフによって上記で提案されたアプローチを使用しました。つまり、並列パッケージを使用して、複数のコアを備えた複数のマシンに驚異的並列ワークロードを分散します。最初にワークロードがすべてのマシンに分散され、次に各マシンのワークロードがすべてのコアに分散されます。このアプローチの欠点は、マシン間で負荷分散が行われないことです(少なくとも方法はわかりません)。
ロードされたすべてのrコードは同じであり、すべてのマシン(svn)の同じ場所にある必要があります。クラスターの初期化にはかなりの時間がかかるため、作成したクラスターを再利用することで、以下のコードを改善できます。
foo <- function(workload, otherArgumentsForFoo) {
source("/home/user/workspace/mycode.R")
...
}
distributedFooOnCores <- function(workload) {
# Somehow assign a batch number to every record
workload$ParBatchNumber = NA
# Split the assigned workload into batches according to DistrParNumber
batches = by(workload, workload$ParBatchNumber, function(x) x)
# Create a cluster with workers on all machines
library("parallel")
cluster = makeCluster(detectCores(), outfile="distributedFooOnCores.log")
batches = parLapply(cluster, batches, foo, otherArgumentsForFoo)
stopCluster(cluster)
# Merge the resulting batches
results = someEmptyDataframe
p = 1;
for(i in 1:length(batches)){
results[p:(p + nrow(batches[[i]]) - 1), ] = batches[[i]]
p = p + nrow(batches[[i]])
}
# Clean up
workload$ParBatchNumber = NULL
return(invisible(results))
}
distributedFooOnMachines <- function(workload) {
# Somehow assign a batch number to every record
workload$DistrBatchNumber = NA
# Split the assigned activity into batches according to DistrBatchNumber
batches = by(workload, workload$DistrBatchNumber, function(x) x)
# Create a cluster with workers on all machines
library("parallel")
# If makeCluster hangs, please make sure passwordless ssh is configured on all machines
cluster = makeCluster(c("machine1", "etc"), master="ub2", user="", outfile="distributedFooOnMachines.log")
batches = parLapply(cluster, batches, foo, otherArgumentsForFoo)
stopCluster(cluster)
# Merge the resulting batches
results = someEmptyDataframe
p = 1;
for(i in 1:length(batches)){
results[p:(p + nrow(batches[[i]]) - 1), ] = batches[[i]]
p = p + nrow(batches[[i]])
}
# Clean up
workload$DistrBatchNumber = NULL
return(invisible(results))
}
上記のアプローチをどのように改善できるかに興味があります。