The zipped-store byte source: chunks read out of one archive.
This is what lets MultiLevelCachingStore cache a .zarr.zip at all. The
store used to build a URL per chunk, which an archive member does not have;
with the ChunkSource seam it just asks this for bytes, and L1/L2 keep
keying on whole chunks exactly as they do for a directory store.
Caching matters more here than for a directory store, not less. Measured on
#1716: reading an archive costs ~2 HTTP requests per member — unzipit reads
each member's 30-byte local file header in a separate, strictly sequential
round trip before its data — and a repeat read cannot be served from the
browser's HTTP cache the way a repeat GET of a per-chunk URL can, because
every member read is a Range request against the same URL. The chunk cache
is what makes those repeats free.
The zipped-store byte source: chunks read out of one archive.
This is what lets
MultiLevelCachingStorecache a.zarr.zipat all. The store used to build a URL per chunk, which an archive member does not have; with the ChunkSource seam it just asks this for bytes, and L1/L2 keep keying on whole chunks exactly as they do for a directory store.Caching matters more here than for a directory store, not less. Measured on #1716: reading an archive costs ~2 HTTP requests per member —
unzipitreads each member's 30-byte local file header in a separate, strictly sequential round trip before its data — and a repeat read cannot be served from the browser's HTTP cache the way a repeat GET of a per-chunk URL can, because every member read is aRangerequest against the same URL. The chunk cache is what makes those repeats free.