GISProjekt RTele-Foto

Przyspieszanie skryptów – znajdź szybszą funkcję (Zonal Statistics)

W pierwszym poście z serii “Przyśpiesz swój skrypt” pokazaliśmy Wam jak wykorzystać bazowe narzędzia R do określenia czasu wykonania danej części skryptu. Dzięki nim dowiedzieliśmy się, że biblioteka sf szybciej wczytuje pliki ESRI Shapefile niż starsza rgdal

Dzisiaj spróbujemy przyspieszyć proste zadanie, jakim jest ekstrakcji średnich wartości z rastra (zobrazowanie Sentinel 2 kanał 8) dla siatki 100 poligonów o kształcie koła o promieniu 10m. 

Oczywiście najprościej użyć do tego funkcji extract znanej nam z biblioteki raster. Dla dużej liczby obiektów narzędzie to jest jednak mało efektywne, dlatego dodatkowo wykorzystamy do tego funkcję:

Na końcu sprawdzimy, która funkcja jest najszybsza.

 

Zaczynamy od załadowania bibliotek, których będziemy używać:

library(raster)
library(sf)
library(velox)
library(exactextractr)

Wczytujemy dane:

r <- raster("d:/B08.tif")
grid <- read_sf(“d:/grid.shp”)

Dane wyglądają tak:

Do oceny, która funkcja działa szybciej wykorzystamy bibliotekę microbenchmark:

library(microbenchmark)

Dla biblioteki velox trzeba przekonwertować raster na format velox:

v <- velox(r)

Piszemy linijkę kodu odpowiadającą za test:

microbenchmark(
extract(r,grid,fun=mean),
exact_extract(r,grid,fun = "mean"),
v$extract(grid,fun = mean),
times = 1
)

Uruchamiamy i czekamy na wynik:

Unit: milliseconds
                                 expr        min lq       mean median     uq max neval
      extract(r, grid_sf, fun = mean) 29565.6830 29602.492 29685.8882 29639.3018 29745.9908 29852.6799     3
 exact_extract(r, grid, fun = "mean")   658.6552 671.882 680.0519 685.1088   690.7502 696.3917 3
          v$extract(grid, fun = mean)  7756.5470 7757.145 7763.5458  7757.7431 7767.0452 7776.3473     3

Używana dotychczas przez nasz funkcja extract okazała się wolniejsza 44 razy niż exact_extract i 4 razy niż funkcja z biblioteki velox. Z porównania wynika, że inne funkcje użyte do naszego zadania są dużo bardziej efektywne, co znacząco skróci czas naszych obliczeń. Pamiętajmy zatem, że do optymalizacji naszego skryptu warto poświęcić trochę czasu na poszukanie szybszego rozwiązania:) My nie lubimy długo czekać, dlatego już dziś zapraszamy Was na kolejny post o przyspieszaniu skryptów.