我正在运行一个类似于查找标准偏差的函数...但运行时间要长得多。
我打算将该函数用于计算标准差的累积值,即第 1 天到第 n 天的标准差类型函数。
但是由于计算需要很长时间,所以我想在集群上运行它。
所以我想拆分数据,以便集群的每个节点大致同时完成。例如如果我的函数如下所示,单机方法将按以下方式工作:
vec <- xts(rnorm(1000),Sys.Date()-(1:1000)
lapply(1:length(vec), function(x){
Sys.sleep(30)
sd(as.numeric(vec[1:x]))
}
(注意,其中添加了 sys.sleep 以表示处理我的自定义函数所花费的额外时间)
但是假设我想将其拆分到两台机器上而不是一台机器上,我将如何拆分向量 1:length(vec)
这样我就可以给每台机器一个列表 c(1:y)
到机器 1 和 c((y+1):length(vec))
到机器 2,这样两台机器都按时完成。即 y 的值是多少,这样两个过程将大致同时完成......如果我们要在 10 台机器上完成它会怎样......如何找到原始向量中的中断 c(1:length(vec))
让它工作...
即我会的
y <- 750 # This is just a guess as to potentially where it might be.
vec <- xts(rnorm(1000),Sys.Date()-(1:1000)
# on machine 1 I would have
lapply(1:y, function(x){
Sys.sleep(30)
sd(as.numeric(vec[1:x]))
}
# and on machine 2 I would have
lapply(y+1:length(vec), function(x){
Sys.sleep(30)
sd(as.numeric(vec[1:x]))
}
最佳答案
parallel package现在是基础 R 的一部分,可以帮助在中等规模的集群上运行 R,包括在 Amazon EC2 上。函数 parLapplyLB 会将来自输入向量的工作分配到集群的工作节点上。
要知道的一件事是 makePSOCKcluster是(目前从 R 2.15.2 开始)限制为 128 名 worker NCONNECTIONS constant in connections.c .
这是一个使用并行包的 session 的简单示例,您可以在自己的机器上试用:
library(parallel)
help(package=parallel)
## create the cluster passing an IP address for
## the head node
## hostname -i works on Linux, but not on BSD
## descendants (like OS X)
# cl <- makePSOCKcluster(hosts, master=system("hostname -i", intern=TRUE))
## for testing, start a cluster on your local machine
cl <- makePSOCKcluster(rep("localhost", 3))
## do something once on each worker
ans <- clusterEvalQ(cl, { mean(rnorm(1000)) })
## push data to the workers
myBigData <- rnorm(10000)
moreData <- c("foo", "bar", "blabber")
clusterExport(cl, c('myBigData', 'moreData'))
## test a time consuming job
## (~30 seconds on a 4 core machine)
system.time(ans <- parLapplyLB(cl, 1:100, function(i) {
## summarize a bunch of random sample means
summary(
sapply(1:runif(1, 100, 2000),
function(j) { mean(rnorm(10000)) }))
}))
## shut down worker processes
stopCluster(cl)
Bioconductor 小组已经建立了一个非常简单的入门方法:Using a parallel cluster in the cloud
有关在 EC2 上使用并行包的更多信息,请参阅:R in the Cloud对于一般集群上的 R,请参见:CRAN Task View: High-Performance and Parallel Computing with R .
最后,R 之外的另一个成熟的选项是 Starcluster .
关于r - 并行处理的负载平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13813743/