parLapply на 2 набора списка - PullRequest
       1

parLapply на 2 набора списка

0 голосов
/ 18 сентября 2018

я пытаюсь запустить функцию на 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?

1 Ответ

0 голосов
/ 19 сентября 2018

Нет необходимости вычислять (потенциально большой) CalcList. Вы можете использовать либо список центров, либо список пунктов назначения в parLapply. Функция, которую вы вызываете, будет затем применять вашу исходную функцию к каждому элементу другого списка, например, используя lapply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...