я пытаюсь запустить функцию на 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)
Короче говоря, в данный момент я создаю список для каждой комбинации, выводим значения ci и di на основе i (индекс списка), используя
ci <- floor((x - 1) / DestinationCount) + 1
di <- x - ((ci - 1) * DestinationCount)
и вычислите соответственно
Проблема: список CalcList занял довольно большой объем ОЗУ после определенного числа.
На данный момент, я вполне удовлетворен производительностью parLapply, есть только проблемас CalcList занял ОЗУ
Я также попробовал doFuture и параллельно с foreach% dopar% вместо parLapply, поэтому parLapply - самый быстрый
Как мне избежать создания CalcList для подачи в список расчетовв parLapply?