Skip to content

Instantly share code, notes, and snippets.

@infotroph
Created September 15, 2017 04:10
Show Gist options
  • Select an option

  • Save infotroph/e54c9a4f945b616701a02be368922dea to your computer and use it in GitHub Desktop.

Select an option

Save infotroph/e54c9a4f945b616701a02be368922dea to your computer and use it in GitHub Desktop.
~10x speedup from lazy-loading standard_vars
library(microbenchmark)
# PEcAn.utils::to_ncvar, revision 79ef207
to_ncvar_current <- function(varname,dims){
standard_vars <- read.csv(system.file("data/standard_vars.csv", package="PEcAn.utils"), stringsAsFactors = FALSE)
var <- standard_vars[which(standard_vars$Variable.Name == varname),]
#check var exists
if(nrow(var)==0){
PEcAn.logger::logger.severe(paste("Variable",varname,"not in standard_vars"))
}
dimset <- var[,c("dim1","dim2","dim3","dim4")]
dim <- dims[which(names(dims) %in% dimset)] #subset list of all dims for this variable
#check that dim isn't 0
if(length(dim)==0 || is.null(dim)){
PEcAn.logger::logger.severe(paste("No dimensions were loaded for",varname))
}
units = as.character(var$Units) #if the units are a factor the function fails
longname <- as.character(var$Long.name)
ncvar <- ncdf4::ncvar_def(name = varname, units = units, longname = longname, dim = dim, -999, prec = "double")
return(ncvar)
}
# PEcAn.LZutils::to_ncvar
# Package modifications to lazy-load rather than reread standard_vars every time
to_ncvar_lazy <- function(varname,dims){
var <- PEcAn.LZutils::standard_vars[which(PEcAn.LZutils::standard_vars$Variable.Name == varname),]
#check var exists
if(nrow(var)==0){
PEcAn.logger::logger.severe(paste("Variable",varname,"not in standard_vars"))
}
dimset <- var[,c("dim1","dim2","dim3","dim4")]
dim <- dims[which(names(dims) %in% dimset)] #subset list of all dims for this variable
#check that dim isn't 0
if(length(dim)==0 || is.null(dim)){
PEcAn.logger::logger.severe(paste("No dimensions were loaded for",varname))
}
units = as.character(var$Units) #if the units are a factor the function fails
longname <- as.character(var$Long.name)
ncvar <- ncdf4::ncvar_def(name = varname, units = units, longname = longname, dim = dim, -999, prec = "double")
return(ncvar)
}
# Generate some fake data to write
dims <- list(
lon = ncdf4::ncdim_def(name = "lon", vals = -88.1, units = "degrees_east") ,
lat = ncdf4::ncdim_def(name = "lat", vals = 40.08, units = "degrees_north"),
time = ncdf4::ncdim_def(name = "time", vals = 3, units = "days since 1700-01-01 00:00:00 UTC"))
microbenchmark(current = to_ncvar_current("NPP", dims), lazy = to_ncvar_lazy("NPP", dims))
@infotroph
Copy link
Author

Unit: microseconds
    expr      min        lq      mean    median        uq      max neval
 current 2675.269 2726.2315 3509.4568 2776.9280 2839.1235 69665.08   100
    lazy  208.281  221.5785  480.6783  227.5105  241.9015 21925.81   100

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment