Skip to content

Commit d4290b3

Browse files
committed
Reduce number of file operations
1 parent c537fca commit d4290b3

File tree

1 file changed

+36
-41
lines changed

1 file changed

+36
-41
lines changed

src/zarr/core/group.py

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -132,30 +132,6 @@ def _parse_async_node(
132132
raise TypeError(f"Unknown node type, got {type(node)}")
133133

134134

135-
async def _get_zarr_version(store_path: StorePath) -> Literal[2, 3]:
136-
"""
137-
Guess Zarr format from present metadata files in a Store.
138-
"""
139-
(
140-
zarr_json_bytes,
141-
zgroup_bytes,
142-
) = await asyncio.gather(
143-
(store_path / ZARR_JSON).exists(),
144-
(store_path / ZGROUP_JSON).exists(),
145-
)
146-
if zarr_json_bytes and zgroup_bytes:
147-
# warn and favor v3
148-
msg = f"Both zarr.json (Zarr format 3) and .zgroup (Zarr format 2) metadata objects exist at {store_path}. Zarr format 3 will be used."
149-
warnings.warn(msg, category=ZarrUserWarning, stacklevel=1)
150-
if not zarr_json_bytes and not zgroup_bytes:
151-
raise FileNotFoundError(f"could not find zarr.json or .zgroup objects in {store_path}")
152-
# set zarr_format based on which keys were found
153-
if zarr_json_bytes:
154-
return 3
155-
else:
156-
return 2
157-
158-
159135
@dataclass(frozen=True)
160136
class ConsolidatedMetadata:
161137
"""
@@ -537,12 +513,32 @@ async def open(
537513
to load consolidated metadata from a non-default key.
538514
"""
539515
store_path = await make_store_path(store)
516+
517+
zarr_json_bytes = None
518+
zarr_group_bytes = None
519+
540520
# Guess zarr_format if not passed explicitly
541521
if zarr_format is None:
542-
zarr_format = await _get_zarr_version(store_path)
543-
return await cls.open(
544-
store=store, zarr_format=zarr_format, use_consolidated=use_consolidated
522+
(
523+
zarr_json_bytes,
524+
zarr_group_bytes,
525+
) = await asyncio.gather(
526+
(store_path / ZARR_JSON).get(),
527+
(store_path / ZGROUP_JSON).get(),
545528
)
529+
# set zarr_format based on which keys were found
530+
if zarr_json_bytes is not None:
531+
zarr_format = 3
532+
if zarr_group_bytes is not None:
533+
msg = f"Both zarr.json (Zarr format 3) and .zgroup (Zarr format 2) metadata objects exist at {store_path}. Zarr format 3 will be used."
534+
warnings.warn(msg, category=ZarrUserWarning, stacklevel=1)
535+
elif zarr_group_bytes is not None:
536+
zarr_format = 2
537+
else:
538+
raise FileNotFoundError(
539+
f"could not find zarr.json or .zgroup objects in {store_path}"
540+
)
541+
546542
assert zarr_format is not None
547543

548544
if not store_path.store.supports_consolidated_metadata:
@@ -561,37 +557,36 @@ async def open(
561557
if isinstance(use_consolidated, str):
562558
consolidated_key = use_consolidated
563559

564-
paths = [store_path / ZGROUP_JSON, store_path / ZATTRS_JSON]
565-
if use_consolidated or use_consolidated is None:
566-
paths.append(store_path / consolidated_key)
560+
if zarr_group_bytes is None:
561+
zarr_group_bytes = await (store_path / ZGROUP_JSON).get()
562+
if zarr_group_bytes is None:
563+
raise FileNotFoundError(store_path)
567564

568-
zgroup_bytes, zattrs_bytes, *rest = await asyncio.gather(
569-
*[path.get() for path in paths]
570-
)
571-
if zgroup_bytes is None:
565+
zattrs_bytes = await (store_path / ZATTRS_JSON).get()
566+
if zattrs_bytes is None:
572567
raise FileNotFoundError(store_path)
573568

574569
if use_consolidated or use_consolidated is None:
575-
maybe_consolidated_metadata_bytes = rest[0]
576-
570+
consolidated_metadata_bytes = await (store_path / consolidated_key).get()
577571
else:
578-
maybe_consolidated_metadata_bytes = None
572+
consolidated_metadata_bytes = None
579573

580-
if use_consolidated and maybe_consolidated_metadata_bytes is None:
574+
if use_consolidated and consolidated_metadata_bytes is None:
581575
# the user requested consolidated metadata, but it was missing
582576
raise ValueError(consolidated_key)
583577

584578
elif use_consolidated is False:
585579
# the user explicitly opted out of consolidated_metadata.
586580
# Discard anything we might have read.
587-
maybe_consolidated_metadata_bytes = None
581+
consolidated_metadata_bytes = None
588582

589583
return cls._from_bytes_v2(
590-
store_path, zgroup_bytes, zattrs_bytes, maybe_consolidated_metadata_bytes
584+
store_path, zarr_group_bytes, zattrs_bytes, consolidated_metadata_bytes
591585
)
592586

593587
elif zarr_format == 3:
594-
zarr_json_bytes = await (store_path / ZARR_JSON).get()
588+
if zarr_json_bytes is None:
589+
zarr_json_bytes = await (store_path / ZARR_JSON).get()
595590
if zarr_json_bytes is None:
596591
raise FileNotFoundError(store_path)
597592
if not isinstance(use_consolidated, bool | None):

0 commit comments

Comments
 (0)