#' 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
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.