From 2fe118f33e11336a4e5277132b76db65e2d7e965 Mon Sep 17 00:00:00 2001 From: Sandor Kertesz Date: Thu, 30 Apr 2026 16:43:02 +0100 Subject: [PATCH 1/3] Grib encoder should handle single metadata differently --- src/earthkit/data/encoders/grib.py | 24 ++++++++++++------- src/earthkit/data/sources/virtual.py | 3 +-- .../data/sources/virtual_directory.py | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/earthkit/data/encoders/grib.py b/src/earthkit/data/encoders/grib.py index 2701fd1fc..a43d948e9 100644 --- a/src/earthkit/data/encoders/grib.py +++ b/src/earthkit/data/encoders/grib.py @@ -723,15 +723,21 @@ def _make_message( else: multiple[k] = v - try: - # Try to set all metadata at once - # This is needed when we set multiple keys that are interdependent - handle.set_multiple(single) - except Exception as e: - LOG.error("Failed to set metadata at once: %s", e) - # Try again, but one by one - for k, v in single.items(): - handle.set(k, v) + if len(single) == 1: + # if there is only one key, set it directly to avoid the overhead of set_multiple + k, v = next(iter(single.items())) + handle.set(k, v) + single = {} + elif len(single) > 1: + try: + # Try to set all metadata at once + # This is needed when we set multiple keys that are interdependent + handle.set_multiple(single) + except Exception as e: + LOG.warning("Failed to set metadata at once: %s", e) + # Try again, but one by one + for k, v in single.items(): + handle.set(k, v) for k, v in multiple.items(): handle.set(k, v) diff --git a/src/earthkit/data/sources/virtual.py b/src/earthkit/data/sources/virtual.py index f828f86d2..86772eec4 100644 --- a/src/earthkit/data/sources/virtual.py +++ b/src/earthkit/data/sources/virtual.py @@ -12,9 +12,8 @@ import logging import threading -from earthkit.data.readers.grib.index import GribFieldList - import earthkit.data as cml +from earthkit.data.readers.grib.index import GribFieldList from earthkit.data.utils.serialise import register_serialisation LOG = logging.getLogger(__name__) diff --git a/src/earthkit/data/sources/virtual_directory.py b/src/earthkit/data/sources/virtual_directory.py index e4edd10ad..5e7ee12ff 100644 --- a/src/earthkit/data/sources/virtual_directory.py +++ b/src/earthkit/data/sources/virtual_directory.py @@ -10,9 +10,9 @@ import warnings from collections import defaultdict -from earthkit.data.readers.grib.index import FieldListInFilesWithSqlIndex from earthkit.data.sources.directory import DirectorySource +from earthkit.data.readers.grib.index import FieldListInFilesWithSqlIndex from earthkit.data.utils.progbar import progress_bar LOG = logging.getLogger(__name__) From 044098002dc8bd16e4bbfd8c45877288d4bf62b3 Mon Sep 17 00:00:00 2001 From: Sandor Kertesz Date: Thu, 30 Apr 2026 16:58:03 +0100 Subject: [PATCH 2/3] Grib encoder should handle single metadata differently --- src/earthkit/data/sources/virtual.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/earthkit/data/sources/virtual.py b/src/earthkit/data/sources/virtual.py index 86772eec4..b314cf71d 100644 --- a/src/earthkit/data/sources/virtual.py +++ b/src/earthkit/data/sources/virtual.py @@ -12,7 +12,7 @@ import logging import threading -import earthkit.data as cml +from earthkit.data import from_source from earthkit.data.readers.grib.index import GribFieldList from earthkit.data.utils.serialise import register_serialisation @@ -59,7 +59,7 @@ def shape(self): return source[self.index].shape -class DictOveray(dict): +class DictOverlay(dict): def __init__(self, field): self.field = field @@ -85,8 +85,8 @@ def __init__(self, **kwargs): ) self.request.update(kwargs) - self.reference = DictOveray( - cml.from_source( + self.reference = DictOverlay( + from_source( "cds", date=19590101, time=0, @@ -139,7 +139,7 @@ def full_month(self, date): yyyy = yyyymm // 100 mm = yyyymm % 100 last = calendar.monthrange(yyyy, mm)[1] - source = cml.from_source( + source = from_source( "cds", year=yyyy, month=mm, From 4cba2687381559a9afcedd6363f3e419124fa794 Mon Sep 17 00:00:00 2001 From: Sandor Kertesz Date: Thu, 30 Apr 2026 17:09:16 +0100 Subject: [PATCH 3/3] Grib encoder should handle single metadata differently --- src/earthkit/data/sources/virtual.py | 3 ++- src/earthkit/data/sources/virtual_directory.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/earthkit/data/sources/virtual.py b/src/earthkit/data/sources/virtual.py index b314cf71d..e70b16ab0 100644 --- a/src/earthkit/data/sources/virtual.py +++ b/src/earthkit/data/sources/virtual.py @@ -12,8 +12,9 @@ import logging import threading -from earthkit.data import from_source from earthkit.data.readers.grib.index import GribFieldList + +from earthkit.data import from_source from earthkit.data.utils.serialise import register_serialisation LOG = logging.getLogger(__name__) diff --git a/src/earthkit/data/sources/virtual_directory.py b/src/earthkit/data/sources/virtual_directory.py index 5e7ee12ff..e4edd10ad 100644 --- a/src/earthkit/data/sources/virtual_directory.py +++ b/src/earthkit/data/sources/virtual_directory.py @@ -10,9 +10,9 @@ import warnings from collections import defaultdict +from earthkit.data.readers.grib.index import FieldListInFilesWithSqlIndex from earthkit.data.sources.directory import DirectorySource -from earthkit.data.readers.grib.index import FieldListInFilesWithSqlIndex from earthkit.data.utils.progbar import progress_bar LOG = logging.getLogger(__name__)