From 6616030e105d0e878c536d507cb2520071bc16cf Mon Sep 17 00:00:00 2001 From: ilan-gold Date: Fri, 5 Jun 2026 13:19:01 +0200 Subject: [PATCH 1/2] perf: try `pread` like `zarrs`'s use of `File::read_exact_at` --- src/zarr/storage/_local.py | 48 ++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/zarr/storage/_local.py b/src/zarr/storage/_local.py index 96f1e61746..624bf965f9 100644 --- a/src/zarr/storage/_local.py +++ b/src/zarr/storage/_local.py @@ -30,18 +30,42 @@ def _get(path: Path, prototype: BufferPrototype, byte_range: ByteRequest | None) -> Buffer: if byte_range is None: return prototype.buffer.from_bytes(path.read_bytes()) - with path.open("rb") as f: - size = f.seek(0, io.SEEK_END) - if isinstance(byte_range, RangeByteRequest): - f.seek(byte_range.start) - return prototype.buffer.from_bytes(f.read(byte_range.end - f.tell())) - elif isinstance(byte_range, OffsetByteRequest): - f.seek(byte_range.offset) - elif isinstance(byte_range, SuffixByteRequest): - f.seek(max(0, size - byte_range.suffix)) - else: - raise TypeError(f"Unexpected byte_range, got {byte_range}.") - return prototype.buffer.from_bytes(f.read()) + + if hasattr(os, "pread"): + # Use pread on systems that support it (Unix-like) + fd = os.open(path, os.O_RDONLY) + try: + if isinstance(byte_range, RangeByteRequest): + length = byte_range.end - byte_range.start + data = os.pread(fd, length, byte_range.start) + elif isinstance(byte_range, OffsetByteRequest): + file_size = os.fstat(fd).st_size + length = max(0, file_size - byte_range.offset) + data = os.pread(fd, length, byte_range.offset) + elif isinstance(byte_range, SuffixByteRequest): + file_size = os.fstat(fd).st_size + offset = max(0, file_size - byte_range.suffix) + length = file_size - offset + data = os.pread(fd, length, offset) + else: + raise TypeError(f"Unexpected byte_range, got {byte_range}.") + return prototype.buffer.from_bytes(data) + finally: + os.close(fd) + else: + # Fallback to seek/read for systems without pread (e.g., Windows) + with path.open("rb") as f: + size = f.seek(0, io.SEEK_END) + if isinstance(byte_range, RangeByteRequest): + f.seek(byte_range.start) + return prototype.buffer.from_bytes(f.read(byte_range.end - f.tell())) + elif isinstance(byte_range, OffsetByteRequest): + f.seek(byte_range.offset) + elif isinstance(byte_range, SuffixByteRequest): + f.seek(max(0, size - byte_range.suffix)) + else: + raise TypeError(f"Unexpected byte_range, got {byte_range}.") + return prototype.buffer.from_bytes(f.read()) if sys.platform == "win32": From 72cb294c8f53663108b0851a5ba839a90a978e2d Mon Sep 17 00:00:00 2001 From: ilan-gold Date: Fri, 5 Jun 2026 13:23:47 +0200 Subject: [PATCH 2/2] perf:move size --- src/zarr/storage/_local.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zarr/storage/_local.py b/src/zarr/storage/_local.py index a91be10e0e..2534b66b04 100644 --- a/src/zarr/storage/_local.py +++ b/src/zarr/storage/_local.py @@ -55,13 +55,13 @@ def _get(path: Path, prototype: BufferPrototype, byte_range: ByteRequest | None) else: # Fallback to seek/read for systems without pread (e.g., Windows) with path.open("rb") as f: - size = f.seek(0, io.SEEK_END) if isinstance(byte_range, RangeByteRequest): f.seek(byte_range.start) return prototype.buffer.from_bytes(f.read(byte_range.end - f.tell())) elif isinstance(byte_range, OffsetByteRequest): f.seek(byte_range.offset) elif isinstance(byte_range, SuffixByteRequest): + size = f.seek(0, io.SEEK_END) f.seek(max(0, size - byte_range.suffix)) else: raise TypeError(f"Unexpected byte_range, got {byte_range}.")