Параллельный код R медленнее внутри функции, чем снаружи - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть некоторый параллельный код R, который я хочу поместить в функцию, но код выполняется гораздо медленнее, когда внутри функции, а не вне функции.

Код принимает матрицу координат и преобразуетих к sf объектам.Приведенный ниже демонстрационный код запускает один и тот же процесс 2 раза.

  • Простой код
  • Тот же код, но в пределах функции

Пример кода:

# Packages
library(parallel)
library(sf)
library(pbapply)

# Sample Data
mat = matrix(runif(1e6,max = 1e5), ncol = 2)
seqs = 1:(nrow(mat)-1)
ncores = 6 # Change as needed

start1 = Sys.time()
# Code not running in a function #########
cl = parallel::makeCluster(ncores)
parallel::clusterExport(cl=cl, varlist=c("mat"), envir = environment())
geoms = pbapply::pblapply(seqs, function(y){sf::st_linestring(mat[c(y,y+1),c(1,2)])}, cl = cl)
parallel::stopCluster(cl)

end1 = Sys.time()

# Same code in a function ###########
func = function(mat, seqs, ncores){
  cl = parallel::makeCluster(ncores)
  parallel::clusterExport(cl=cl, varlist=c("mat"), envir = environment())
  geoms = pbapply::pblapply(seqs, function(y){sf::st_linestring(mat[c(y,y+1),c(1,2)])}, cl = cl)
  parallel::stopCluster(cl)
  return(geoms)
}

start2 = Sys.time()
res = func(mat, seqs, ncores)
end2 = Sys.time()


# Compare Results 
difftime(end1, start1, units = "s")
difftime(end2, start2, units = "s")

При сравнении времени происходит значительное замедление для кода в функции

difftime(end1, start1, units = "s")
Time difference of 41.98823 secs
difftime(end2, start2, units = "s")
Time difference of 114.983 secs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...