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?
答案 0 :(得分:0)
无需计算(可能很大)CalcList
。您可以在parLapply
中使用中心列表或目的地列表。然后,您要调用的函数会将原始函数应用于其他列表的每个元素,例如使用lapply
。