Skip to content

Commit

Permalink
Force garbage collection in benchmarking code
Browse files Browse the repository at this point in the history
gcpy/benchmark.py
gcpy/budget_ox.py
gcpy/budget_tt.py
gcpy/ste_flux.py
- At the end of each method, manually delete the larger objects
  (such as xarray Datasets) and call gc.collect() to force
  garbage collection. This should hopefully prevent problems with
  the benchmark scripts halting due to exceeding requested memory
  (which seems to happen if all 1-year benchmark artifacts are
  requested).

Signed-off-by: Bob Yantosca <[email protected]>
  • Loading branch information
yantosca committed Oct 4, 2022
1 parent f0003b9 commit 71cdba9
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 40 deletions.
125 changes: 85 additions & 40 deletions gcpy/benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@
import sparselt.xr
from joblib import Parallel, delayed
from tabulate import tabulate
import gcpy.util as util
from gcpy import util
from gcpy.plot import compare_single_level, compare_zonal_mean
from gcpy.regrid import create_regridders
from gcpy.grid import get_troposphere_mask
from gcpy.units import convert_units
import gcpy.constants as gcon
import gc

# Save warnings format to undo overwriting built into PyPDF2
warning_format = warnings.showwarning
Expand Down Expand Up @@ -1203,13 +1204,20 @@ def createplots(filecat):
# -------------------------------------------
# Clean up
# -------------------------------------------
refds = xr.Dataset()
devds = xr.Dataset()
refmetds = xr.Dataset()
devmetds = xr.Dataset()
second_ref = xr.Dataset()
second_dev = xr.Dataset()

#refds = xr.Dataset()
#devds = xr.Dataset()
#refmetds = xr.Dataset()
#devmetds = xr.Dataset()
#second_ref = xr.Dataset()
#second_dev = xr.Dataset()
del refds
del devds
del refmetds
del devmetds
del second_ref
del second_dev
gc.collect()


def make_benchmark_emis_plots(
ref,
Expand Down Expand Up @@ -1617,8 +1625,11 @@ def createfile_bench_cat(filecat):
# -------------------------------------------
# Clean up
# -------------------------------------------
refds = xr.Dataset()
devds = xr.Dataset()
#refds = xr.Dataset()
#devds = xr.Dataset()
del refds
del devds
gc.collect()


def make_benchmark_emis_tables(
Expand Down Expand Up @@ -1792,11 +1803,16 @@ def make_benchmark_emis_tables(
# -------------------------------------------
# Clean up
# -------------------------------------------
refds = xr.Dataset()
devds = xr.Dataset()
refmetds = xr.Dataset()
devmetds = xr.Dataset()

#refds = xr.Dataset()
#devds = xr.Dataset()
#refmetds = xr.Dataset()
#devmetds = xr.Dataset()
del refds
del devds
del refmetds
del devmetds
gc.collect()


def make_benchmark_jvalue_plots(
ref,
Expand Down Expand Up @@ -2190,9 +2206,12 @@ def make_benchmark_jvalue_plots(
# -------------------------------------------
# Clean up
# -------------------------------------------
refds = xr.Dataset()
devds = xr.Dataset()

#refds = xr.Dataset()
#devds = xr.Dataset()
del refds
del devds
gc.collect()


def make_benchmark_aod_plots(
ref,
Expand Down Expand Up @@ -2507,8 +2526,11 @@ def make_benchmark_aod_plots(
# -------------------------------------------
# Clean up
# -------------------------------------------
refds = xr.Dataset()
devds = xr.Dataset()
#refds = xr.Dataset()
#devds = xr.Dataset()
del refds
del devds
gc.collect()


def make_benchmark_mass_tables(
Expand Down Expand Up @@ -2760,9 +2782,12 @@ def make_benchmark_mass_tables(
# -------------------------------------------
# Clean up
# -------------------------------------------
refds = xr.Dataset()
devds = xr.Dataset()

#refds = xr.Dataset()
#devds = xr.Dataset()
del refds
del devds
gc.collect()


def make_benchmark_oh_metrics(
ref,
Expand Down Expand Up @@ -2987,10 +3012,15 @@ def print_metrics_to_file(f, title1, title2, ref, dev, diff, pctdiff):
# -------------------------------------------
# Clean up
# -------------------------------------------
refds = xr.Dataset()
devds = xr.Dataset()
refmetds = xr.Dataset()
devmetds = xr.Dataset()
#refds = xr.Dataset()
#devds = xr.Dataset()
#refmetds = xr.Dataset()
#devmetds = xr.Dataset()
del refds
del devds
del refmetds
del devmetds
gc.collect()


def make_benchmark_wetdep_plots(
Expand Down Expand Up @@ -3272,11 +3302,16 @@ def make_benchmark_wetdep_plots(
# -------------------------------------------
# Clean up
# -------------------------------------------
refds = xr.Dataset()
devds = xr.Dataset()
refmetds = xr.Dataset()
devmetds = xr.Dataset()

#refds = xr.Dataset()
#devds = xr.Dataset()
#refmetds = xr.Dataset()
#devmetds = xr.Dataset()
del refds
del devds
del refmetds
del devmetds
gc.collect()


def make_benchmark_aerosol_tables(
devdir,
Expand Down Expand Up @@ -3558,10 +3593,14 @@ def print_aerosol_metrics(data, species_list, filename, title, label):
# -------------------------------------------
# Clean up
# -------------------------------------------
ds_aer = xr.Dataset()
ds_spc = xr.Dataset()
ds_met = xr.Dataset()

#ds_aer = xr.Dataset()
#ds_spc = xr.Dataset()
#ds_met = xr.Dataset()
del ds_aer
del ds_spc
del ds_met
gc.collect()


def make_benchmark_operations_budget(
refstr,
Expand Down Expand Up @@ -4089,10 +4128,14 @@ def make_benchmark_operations_budget(
# ------------------------------------------
# Clean up
# ------------------------------------------
df = pd.DataFrame()
ref_ds = xr.Dataset()
dev_ds = xr.Dataset()

#df = pd.DataFrame()
#ref_ds = xr.Dataset()
#dev_ds = xr.Dataset()
del df
del ref_ds
del dev_ds
gc.collect()


def make_benchmark_mass_conservation_table(
datafiles,
Expand Down Expand Up @@ -4239,6 +4282,8 @@ def make_benchmark_mass_conservation_table(
print(' Abs diff = {:>16.3f} g'.format(absdiff), file=f)
print(' Pct diff = {:>16.10f} %'.format(pctdiff), file=f)

gc.collect()


def get_species_database_dir(config):
"""
Expand Down
12 changes: 12 additions & 0 deletions gcpy/budget_ox.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import gcpy.constants as constants
from gcpy.grid import get_troposphere_mask
import gcpy.util as util
import gc

# Suppress harmless run-time warnings (mostly about underflow in division)
warnings.filterwarnings("ignore", category=RuntimeWarning)
Expand Down Expand Up @@ -753,3 +754,14 @@ def global_ox_budget(
drydep,
metrics
)

# ==================================================================
# Force garbage collection
# ==================================================================
del globvars
del mass
del prodloss
del wetdep
del drydep
del metrics
gc.collect()
9 changes: 9 additions & 0 deletions gcpy/budget_tt.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import gcpy.constants as constants
from gcpy.grid import get_troposphere_mask
import gcpy.util as util
import gc

# Suppress harmless run-time warnings (mostly about underflow in division)
warnings.filterwarnings("ignore", category=RuntimeWarning)
Expand Down Expand Up @@ -944,3 +945,11 @@ def transport_tracers_budgets(
data,
key
)

# ==================================================================
# Force garbage collection
# ==================================================================
del globvars
del data
del ds
gc.collect()
6 changes: 6 additions & 0 deletions gcpy/ste_flux.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import pandas as pd
import xarray as xr
import gcpy.constants as physconsts
import gc

# Suppress harmless run-time warnings (mostly about underflow in division)
warnings.filterwarnings("ignore", category=RuntimeWarning)
Expand Down Expand Up @@ -325,3 +326,8 @@ def make_benchmark_ste_table(devstr, files, year,

# Print the STE fluxes
print_ste(globvars, df)

# Force garbage collection
del globvars
del df
gc.collect()

0 comments on commit 71cdba9

Please sign in to comment.