Parallelize spatial computation over multiple raster files
Source:R/scale_process.R
par_multirasters.Rd
Large raster files usually exceed the memory capacity in size.
This function can be helpful to process heterogenous raster files with
homogeneous summary functions. Heterogenous raster files refer to
rasters with different spatial extents and resolutions.
Cropping a large raster into a small subset even consumes
a lot of memory and adds processing time.
This function leverages terra
SpatRaster
to distribute computation jobs over multiple threads.
It is assumed that users have multiple large raster files
in their disk, then each file path is assigned to a thread.
Each thread will directly read raster values from
the disk using C++ pointers that operate in terra functions.
For use, it is strongly recommended to use vector data with
small and confined spatial extent for computation to avoid
out-of-memory error. y
argument in fun_dist
will be used as-is.
That means no preprocessing or subsetting will be
applied. Please be aware of the spatial extent and size of the
inputs.
Arguments
- filenames
character. A vector or list of full file paths of raster files. n is the total number of raster files.
- fun_dist
terra or chopin functions that accept
SpatRaster
object in an argument. In particular,x
andy
arguments should be present andx
should be aSpatRaster
.- ...
Arguments passed to the argument
fun_dist
.- .debug
logical(1). Default is
FALSE
. IfTRUE
and a unit computation fails, the error message and the file path where the error occurred will be included in the output.
Value
a data.frame object with computation results.
For entries of the results,
consult the function used in fun_dist
argument.
See also
future::multisession
, future::multicore
, future::cluster
,
future.mirai::mirai_multisession
, future::plan
, par_convert_f
Other Parallelization:
par_cut_coords()
,
par_grid()
,
par_hierarchy()
,
par_make_grid()
,
par_merge_grid()
,
par_pad_balanced()
,
par_pad_grid()
,
par_split_list()
Author
Insang Song geoissong@gmail.com
Examples
library(terra)
library(sf)
library(future)
library(future.mirai)
sf::sf_use_s2(FALSE)
future::plan(future.mirai::mirai_multisession, workers = 2)
ncpath <- system.file("extdata/nc_hierarchy.gpkg", package = "chopin")
nccnty <- sf::st_read(ncpath, layer = "county")
#> Reading layer `county' from data source
#> `/home/runner/work/_temp/Library/chopin/extdata/nc_hierarchy.gpkg'
#> using driver `GPKG'
#> Simple feature collection with 100 features and 1 field
#> Geometry type: POLYGON
#> Dimension: XY
#> Bounding box: xmin: 1054155 ymin: 1341756 xmax: 1838923 ymax: 1690176
#> Projected CRS: NAD83 / Conus Albers
ncelev <-
system.file("extdata/nc_srtm15_otm.tif", package = "chopin")
ncelevras <- terra::rast(ncelev)
tdir <- tempdir(check = TRUE)
terra::writeRaster(ncelevras, file.path(tdir, "test1.tif"), overwrite = TRUE)
terra::writeRaster(ncelevras, file.path(tdir, "test2.tif"), overwrite = TRUE)
testfiles <- list.files(tdir, pattern = "tif$", full.names = TRUE)
res <- par_multirasters(
filenames = testfiles,
fun_dist = extract_at,
x = ncelev,
y = nccnty,
id = "GEOID",
func = "mean"
)
#> ℹ Input is not a character.
#> Input is a character. Attempt to read it with terra::rast...
#> ℹ Your input function at /tmp/Rtmps5j76n/test1.tif is dispatched.
#> Input is a character. Attempt to read it with terra::rast...
#> ℹ Your input function at /tmp/Rtmps5j76n/test2.tif is dispatched.