From d9cd85d5d31d80a4eba0bb3d1b4f9681da14e6e1 Mon Sep 17 00:00:00 2001 From: "stephen.worsley" Date: Tue, 18 Nov 2025 15:39:45 +0000 Subject: [PATCH 1/3] free up esmpy object memory --- src/esmf_regrid/esmf_regridder.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/esmf_regrid/esmf_regridder.py b/src/esmf_regrid/esmf_regridder.py index 8e4b891d..fd706050 100644 --- a/src/esmf_regrid/esmf_regridder.py +++ b/src/esmf_regrid/esmf_regridder.py @@ -113,12 +113,20 @@ def __init__( self.esmf_regrid_version = esmf_regrid.__version__ if precomputed_weights is None: self.esmf_version = esmpy.__version__ + src_field = src.make_esmf_field() + tgt_field = tgt.make_esmf_field() weights_dict = _get_regrid_weights_dict( - src.make_esmf_field(), - tgt.make_esmf_field(), + src_field, + tgt_field, regrid_method=method.value, esmf_args=esmf_args, ) + src_sdo = src_field.grid + src_field.destroy() + src_sdo.destroy() + tgt_sdo = tgt_field.grid + tgt_field.destroy() + tgt_sdo.destroy() self.weight_matrix = _weights_dict_to_sparse_array( weights_dict, (self.tgt._refined_size, self.src._refined_size), From 75bf6056abc72e42169e5e94a56d18042a443434 Mon Sep 17 00:00:00 2001 From: "stephen.worsley" Date: Tue, 18 Nov 2025 16:52:29 +0000 Subject: [PATCH 2/3] ensure memory is freed with try-finally block --- src/esmf_regrid/esmf_regridder.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/esmf_regrid/esmf_regridder.py b/src/esmf_regrid/esmf_regridder.py index fd706050..800fdbd3 100644 --- a/src/esmf_regrid/esmf_regridder.py +++ b/src/esmf_regrid/esmf_regridder.py @@ -114,19 +114,21 @@ def __init__( if precomputed_weights is None: self.esmf_version = esmpy.__version__ src_field = src.make_esmf_field() - tgt_field = tgt.make_esmf_field() - weights_dict = _get_regrid_weights_dict( - src_field, - tgt_field, - regrid_method=method.value, - esmf_args=esmf_args, - ) src_sdo = src_field.grid - src_field.destroy() - src_sdo.destroy() + tgt_field = tgt.make_esmf_field() tgt_sdo = tgt_field.grid - tgt_field.destroy() - tgt_sdo.destroy() + try: + weights_dict = _get_regrid_weights_dict( + src_field, + tgt_field, + regrid_method=method.value, + esmf_args=esmf_args, + ) + finally: + src_field.destroy() + src_sdo.destroy() + tgt_field.destroy() + tgt_sdo.destroy() self.weight_matrix = _weights_dict_to_sparse_array( weights_dict, (self.tgt._refined_size, self.src._refined_size), From dee72aeebf6726c9f6f9f975ca8214b28a478c24 Mon Sep 17 00:00:00 2001 From: "stephen.worsley" Date: Tue, 18 Nov 2025 17:12:33 +0000 Subject: [PATCH 3/3] add to CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b3120b0..8a44925b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] +### Fixed + +- [PR#593](https://github.com/SciTools/iris-esmf-regrid/pull/593) + Freed up memory that was being held onto by esmpy when initialising + regridders. + [@stephenworsley](https://github.com/stephenworsley) + ### Added - [PR#506](https://github.com/SciTools/iris-esmf-regrid/pull/506)