Skip to content

Commit cd3a737

Browse files
committed
Reduce number of file operations
1 parent a008942 commit cd3a737

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
@@ -131,30 +131,6 @@ def _parse_async_node(
131131
raise TypeError(f"Unknown node type, got {type(node)}")
132132

133133

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

547543
if not store_path.store.supports_consolidated_metadata:
@@ -560,37 +556,36 @@ async def open(
560556
if isinstance(use_consolidated, str):
561557
consolidated_key = use_consolidated
562558

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

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

573568
if use_consolidated or use_consolidated is None:
574-
maybe_consolidated_metadata_bytes = rest[0]
575-
569+
consolidated_metadata_bytes = await (store_path / consolidated_key).get()
576570
else:
577-
maybe_consolidated_metadata_bytes = None
571+
consolidated_metadata_bytes = None
578572

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

583577
elif use_consolidated is False:
584578
# the user explicitly opted out of consolidated_metadata.
585579
# Discard anything we might have read.
586-
maybe_consolidated_metadata_bytes = None
580+
consolidated_metadata_bytes = None
587581

588582
return cls._from_bytes_v2(
589-
store_path, zgroup_bytes, zattrs_bytes, maybe_consolidated_metadata_bytes
583+
store_path, zarr_group_bytes, zattrs_bytes, consolidated_metadata_bytes
590584
)
591585

592586
elif zarr_format == 3:
593-
zarr_json_bytes = await (store_path / ZARR_JSON).get()
587+
if zarr_json_bytes is None:
588+
zarr_json_bytes = await (store_path / ZARR_JSON).get()
594589
if zarr_json_bytes is None:
595590
raise FileNotFoundError(store_path)
596591
if not isinstance(use_consolidated, bool | None):

0 commit comments

Comments
 (0)