R/split_layers.R

Defines functions split_layers

Documented in split_layers

#' Split RasterStack into memory-safe chunks for processing
#'
#' @param s Input RasterStack
#' @param mem_share Share of memory to be used
#' @param mem_of_total Is 'mem_share' specified as share of total memory (instead of currently available)?
#'
#' @return List of RasterStacks
#' @export


split_layers <- function(s, mem_share = 0.7, mem_of_total = FALSE) {

  # how much memory do we have?
  if(mem_of_total) {
    mem_limit <- utils::memory.limit() / 1024
    mem_to_be_used <- mem_limit * mem_share
  } else {
    mem_available <- as.numeric(
      gsub("\r","",gsub("FreePhysicalMemory=","",
                        system('wmic OS get FreePhysicalMemory /Value',intern=TRUE)[3])))/1024/1024
    mem_to_be_used <- mem_available * mem_share
  }

  # how much memory will the raster values use up?
  r_mem_per_layer <- raster::ncell(s) *  8 / 1024/1024/1024
  r_mem_size <- raster::nlayers(s) * r_mem_per_layer

  if(r_mem_per_layer > mem_available) {
    stop("A single band of the input RasterStack does not fit into memory.")
  }

  # split up raster in processing chunks to safeguard memory usage
  n_chunks <- ceiling(r_mem_size / mem_to_be_used)

  indices_list <- parallel::splitIndices(raster::nlayers(s), n_chunks)

  raster_chunk_list <- lapply(indices_list, function(i) {
    raster::subset(s, i)
  })

  raster_chunk_list

}
juoe/vxr documentation built on April 24, 2020, 12:56 a.m.