diff --git a/src/earthkit/data/encoders/grib.py b/src/earthkit/data/encoders/grib.py index 2701fd1f..a43d948e 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 f828f86d..e70b16ab 100644 --- a/src/earthkit/data/sources/virtual.py +++ b/src/earthkit/data/sources/virtual.py @@ -14,7 +14,7 @@ from earthkit.data.readers.grib.index import GribFieldList -import earthkit.data as cml +from earthkit.data import from_source from earthkit.data.utils.serialise import register_serialisation LOG = logging.getLogger(__name__) @@ -60,7 +60,7 @@ def shape(self): return source[self.index].shape -class DictOveray(dict): +class DictOverlay(dict): def __init__(self, field): self.field = field @@ -86,8 +86,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, @@ -140,7 +140,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,