У меня есть некоторый параллельный код 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