【发布时间】:2016-11-26 06:03:42
【问题描述】:
我正在运行一个类似于查找标准偏差的函数...但运行时间要长得多。
我打算使用该函数来计算标准差的累积值,即第 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,我将如何拆分向量 1:length(vec) 以便我可以为每台机器提供 c(1:y) 到机器 1 和 c((y+1):length(vec)) 到机器的列表2、使两台机器按时完成。即 y 的值是多少,这样两个过程将大致同时完成......如果我们要在 10 台机器上完成它会怎样......如何在原始向量中找到中断 @987654325 @ 让它工作......
即我会的
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]))
}
【问题讨论】:
-
我会考虑以递归方式重写算法和/或矢量化计算。这可以节省大量的重复计算。请注意,您仍然可以通过例如并行化它将
x = seq (1, length (vec), by = p) + (0 : (p - 1))分配给p不同的工作人员(但这将意味着再次重复计算,但不像总是从 1 开始计算那么多)。
标签: r parallel-processing load-balancing