并套用在2套清单上

时间:2018-09-18 08:54:22

标签: r parallel-processing

im试图对2组数据运行函数 每个数据都设置了纬度和经度,例如:

a <- data.frame(Location = c("a","b"), Latitude = c(99.1,99.2), Longitude = c(114.1,114.2))
b <- data.frame(Location = c("c","d"), Latitude = c(99.3,99.4), Longitude = c(114.3,114.4))

该函数是(仅作为示例,使用毕达哥拉斯)

fn_dist <- function(xi,yi){dist <- sqrt((a[xi,2] - b[yi,2]) ^ 2 + (a[xi,3] - b[yi,3]) ^ 2)}

当前在以下使用即时通讯:

CenterCount <- nrow(a) #find Center Count
DestinationCount <- nrow(b) #find Destination Count
CalcList <- seq(1, (CenterCount * DestinationCount))

并行设置

UseCore <- 28
cl <- makeCluster(getOption("cl.cores", UseCore))
clusterEvalQ(cl, library(SPEI))
clusterExport(cl, ls())

运行列表

ResultList <- parLapply(cl, CalcList, fn_Dist)

绑定结果

Result <- rbind.fill(ResultList)

停止集群

stopCluster(cl)

因此,简而言之,即时通讯目前正在为每个组合创建一个列表,使用

根据i(列表索引)推断ci和di的值
ci <- floor((x - 1) / DestinationCount) + 1
di <- x - ((ci - 1) * DestinationCount)

并据此进行计算

问题: 列表CalcList在一定数目后占用了相当大的RAM。

目前,我对parLapply的性能非常满意,只是CalcList占用了内存的问题

我也尝试过doFuture并与foreach%dopar%并行而不是parLapply,到目前为止,parLapply是最快的

如何避免创建CalcList来将计算列表输入parLapply?

1 个答案:

答案 0 :(得分:0)

无需计算(可能很大)CalcList。您可以在parLapply中使用中心列表或目的地列表。然后,您要调用的函数会将原始函数应用于其他列表的每个元素,例如使用lapply