From ad33ab22ed0e98d5a8a24910eab2d17843bc3205 Mon Sep 17 00:00:00 2001 From: Ilan Gold Date: Tue, 8 Apr 2025 09:17:57 +0000 Subject: [PATCH 1/7] (chore): update benchmarks --- makefile | 2 -- measurements/benchmark_read_all.csv | 6 +++--- measurements/benchmark_read_all.md | 6 +++--- requirements.txt | 4 ++-- scripts/zarr_python_benchmark_read.py | 6 +++--- scripts/zarr_python_benchmark_roundtrip.py | 6 +++--- scripts/zarrs_dask_python_benchmark_read.py | 1 + scripts/zarrs_dask_python_benchmark_roundtrip.py | 1 + scripts/zarrs_python_benchmark_read.py | 7 ++++--- scripts/zarrs_python_benchmark_roundtrip.py | 7 ++++--- 10 files changed, 24 insertions(+), 22 deletions(-) diff --git a/makefile b/makefile index 0fc2ef8..5fb5ffa 100644 --- a/makefile +++ b/makefile @@ -1,8 +1,6 @@ setup: uv venv --python 3.12 uv pip install -r requirements.txt - uv pip install git+https://github.com/ilan-gold/zarrs-python.git@ld/chunk_codec_concurrency - # uv pip install --upgrade --force-reinstall ../zarrs-python cargo binstall zarrs_tools@0.6.0-beta.1 binstall: diff --git a/measurements/benchmark_read_all.csv b/measurements/benchmark_read_all.csv index c565eee..72bffa1 100644 --- a/measurements/benchmark_read_all.csv +++ b/measurements/benchmark_read_all.csv @@ -1,6 +1,6 @@ Metric,Time (s),Time (s),Time (s),Time (s),Time (s),Time (s),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB) Implementation,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python Image,,,,,,,,,,,, -data/benchmark.zarr,2.37,2.98,3.42,3.09,5.03,4.54,9.078368,11.447836,8.76694,9.22934,16.839548,16.847508 -data/benchmark_compress.zarr,2.15,2.94,3.06,2.51,5.19,4.0,9.3663,9.688068,8.988624,9.42066,17.131092,17.061112 -data/benchmark_compress_shard.zarr,1.65,2.02,29.08,2.28,40.73,4.24,8.458552,8.63794,9.01874,8.508508,17.01946,16.937372 +data/benchmark.zarr,6.21,6.29,8.11,7.48,9.39,9.07,8.739416,8.786544,8.765064,8.963036,16.83394,16.838632 +data/benchmark_compress.zarr,2.4,4.79,5.92,3.82,7.59,5.74,9.024708,9.311168,8.960372,9.131352,17.065612,16.960148 +data/benchmark_compress_shard.zarr,2.75,3.51,53.05,4.61,256.25,105.61,8.445184,8.932096,8.966272,8.497484,17.044724,16.981704 diff --git a/measurements/benchmark_read_all.md b/measurements/benchmark_read_all.md index ea2117b..993d60f 100644 --- a/measurements/benchmark_read_all.md +++ b/measurements/benchmark_read_all.md @@ -1,5 +1,5 @@ | Image | Time (s)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | Memory (GB)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | |:-----------------------------------|----------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:|-------------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:| -| data/benchmark.zarr | 2.37 | 2.98 | 3.42 | 3.09 | 5.03 | 4.54 | 9.08 | 11.45 | 8.77 | 9.23 | 16.84 | 16.85 | -| data/benchmark_compress.zarr | 2.15 | 2.94 | 3.06 | 2.51 | 5.19 | 4.00 | 9.37 | 9.69 | 8.99 | 9.42 | 17.13 | 17.06 | -| data/benchmark_compress_shard.zarr | 1.65 | 2.02 | 29.08 | 2.28 | 40.73 | 4.24 | 8.46 | 8.64 | 9.02 | 8.51 | 17.02 | 16.94 | \ No newline at end of file +| data/benchmark.zarr | 6.21 | 6.29 | 8.11 | 7.48 | 9.39 | 9.07 | 8.74 | 8.79 | 8.77 | 8.96 | 16.83 | 16.84 | +| data/benchmark_compress.zarr | 2.40 | 4.79 | 5.92 | 3.82 | 7.59 | 5.74 | 9.02 | 9.31 | 8.96 | 9.13 | 17.07 | 16.96 | +| data/benchmark_compress_shard.zarr | 2.75 | 3.51 | 53.05 | 4.61 | 256.25 | 105.61 | 8.45 | 8.93 | 8.97 | 8.50 | 17.04 | 16.98 | \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 440fcbb..60d83a9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,8 +3,8 @@ numpy==1.26.4 dask==2024.11.2 xarray==2024.10.0 # xarray-tensorstore==0.1.5 -zarr==3.0.0b2 -zarrs==0.1.0 +zarr==3.0.6 +zarrs==0.1.3 pandas==2.2.3 tabulate==0.9.0 tensorstore==0.1.67 diff --git a/scripts/zarr_python_benchmark_read.py b/scripts/zarr_python_benchmark_read.py index ad9884a..cb21af5 100755 --- a/scripts/zarr_python_benchmark_read.py +++ b/scripts/zarr_python_benchmark_read.py @@ -8,7 +8,7 @@ import sys import zarr -from zarr.storage import LocalStore, RemoteStore +from zarr.storage import LocalStore, FsspecStore from zarr.core.indexing import BlockIndexer from zarr.core.buffer import default_buffer_prototype @@ -33,9 +33,9 @@ async def main(path, concurrent_chunks, read_all): # sys.exit(1) if path.startswith("http"): - store = RemoteStore(url=path) # broken with zarr-python 3.0.0a0 + store = FsspecStore.from_url(url=path) # broken with zarr-python 3.0.0a0 else: - store = LocalStore(path) + store = LocalStore(path, read_only=True) dataset = zarr.open(store=store, mode='r') diff --git a/scripts/zarr_python_benchmark_roundtrip.py b/scripts/zarr_python_benchmark_roundtrip.py index cafbc5f..62d9dff 100755 --- a/scripts/zarr_python_benchmark_roundtrip.py +++ b/scripts/zarr_python_benchmark_roundtrip.py @@ -8,7 +8,7 @@ import sys import zarr -from zarr.storage import LocalStore, RemoteStore +from zarr.storage import LocalStore, FsspecStore from zarr.core.indexing import BlockIndexer from zarr.core.buffer import default_buffer_prototype @@ -32,9 +32,9 @@ async def main(path, output): # sys.exit(1) if path.startswith("http"): - store = RemoteStore(url=path) # broken with zarr-python 3.0.0a0 + store = FsspecStore.from_url(url=path) # broken with zarr-python 3.0.0a0 else: - store = LocalStore(path) + store = LocalStore(path, read_only=True) dataset = zarr.open(store=store, mode='r') dataset_out = zarr.create(store=LocalStore(output), mode='w', shape=dataset.shape, chunks=dataset.chunks, dtype=dataset.dtype, codecs=dataset.metadata.codecs) diff --git a/scripts/zarrs_dask_python_benchmark_read.py b/scripts/zarrs_dask_python_benchmark_read.py index 9c5197e..35188e4 100755 --- a/scripts/zarrs_dask_python_benchmark_read.py +++ b/scripts/zarrs_dask_python_benchmark_read.py @@ -14,6 +14,7 @@ "threading.num_workers": None, "array.write_empty_chunks": False, "codec_pipeline": { + 'batch_size': 1, "path": "zarrs.ZarrsCodecPipeline", "validate_checksums": True, "store_empty_chunks": False, diff --git a/scripts/zarrs_dask_python_benchmark_roundtrip.py b/scripts/zarrs_dask_python_benchmark_roundtrip.py index 1878bfe..cd2c74d 100755 --- a/scripts/zarrs_dask_python_benchmark_roundtrip.py +++ b/scripts/zarrs_dask_python_benchmark_roundtrip.py @@ -13,6 +13,7 @@ "threading.num_workers": None, "array.write_empty_chunks": False, "codec_pipeline": { + 'batch_size': 1, "path": "zarrs.ZarrsCodecPipeline", "validate_checksums": True, "store_empty_chunks": False, diff --git a/scripts/zarrs_python_benchmark_read.py b/scripts/zarrs_python_benchmark_read.py index e5c9b13..6a7733f 100755 --- a/scripts/zarrs_python_benchmark_read.py +++ b/scripts/zarrs_python_benchmark_read.py @@ -8,7 +8,7 @@ import sys import zarr -from zarr.storage import LocalStore, RemoteStore +from zarr.storage import LocalStore, FsspecStore from zarr.core.indexing import BlockIndexer from zarr.core.buffer import default_buffer_prototype @@ -17,6 +17,7 @@ "threading.num_workers": None, "array.write_empty_chunks": False, "codec_pipeline": { + 'batch_size': 1, "path": "zarrs.ZarrsCodecPipeline", "validate_checksums": True, "store_empty_chunks": False, @@ -43,9 +44,9 @@ async def main(path, concurrent_chunks, read_all): # sys.exit(1) if path.startswith("http"): - store = RemoteStore(url=path) # broken with zarr-python 3.0.0a0 + store = FsspecStore.from_url(url=path) # broken with zarr-python 3.0.0a0 else: - store = LocalStore(path) + store = LocalStore(path, read_only=True) dataset = zarr.open(store=store, mode='r') diff --git a/scripts/zarrs_python_benchmark_roundtrip.py b/scripts/zarrs_python_benchmark_roundtrip.py index 9bbc4f5..bc99c41 100755 --- a/scripts/zarrs_python_benchmark_roundtrip.py +++ b/scripts/zarrs_python_benchmark_roundtrip.py @@ -4,13 +4,14 @@ import click import zarr -from zarr.storage import LocalStore, RemoteStore +from zarr.storage import LocalStore, FsspecStore import zarrs zarr.config.set({ "threading.num_workers": None, "array.write_empty_chunks": False, "codec_pipeline": { + 'batch_size': 1, "path": "zarrs.ZarrsCodecPipeline", "validate_checksums": True, "store_empty_chunks": False, @@ -24,9 +25,9 @@ @click.argument('output', type=str) def main(path, output): if path.startswith("http"): - store = RemoteStore(url=path) # broken with zarr-python 3.0.0a0 + store = FsspecStore.from_url(url=path) # broken with zarr-python 3.0.0a0 else: - store = LocalStore(path) + store = LocalStore(path, read_only=True) dataset = zarr.open(store=store, mode='r') dataset_out = zarr.create(store=LocalStore(output), mode='w', shape=dataset.shape, chunks=dataset.chunks, dtype=dataset.dtype, codecs=dataset.metadata.codecs) From 7823bb7ef969bb14f065baeb63c11a12daa3ac36 Mon Sep 17 00:00:00 2001 From: Ilan Gold Date: Tue, 8 Apr 2025 12:01:48 +0000 Subject: [PATCH 2/7] (fix): dask perf + block indexing fix --- measurements/benchmark_read_all.csv | 6 +++--- measurements/benchmark_read_all.md | 6 +++--- scripts/zarr_dask_python_benchmark_read.py | 4 ++-- scripts/zarr_dask_python_benchmark_roundtrip.py | 3 ++- scripts/zarr_python_benchmark_read.py | 2 +- scripts/zarrs_dask_python_benchmark_read.py | 4 ++-- scripts/zarrs_dask_python_benchmark_roundtrip.py | 4 ++-- scripts/zarrs_python_benchmark_read.py | 2 +- 8 files changed, 16 insertions(+), 15 deletions(-) diff --git a/measurements/benchmark_read_all.csv b/measurements/benchmark_read_all.csv index 72bffa1..e296451 100644 --- a/measurements/benchmark_read_all.csv +++ b/measurements/benchmark_read_all.csv @@ -1,6 +1,6 @@ Metric,Time (s),Time (s),Time (s),Time (s),Time (s),Time (s),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB) Implementation,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python Image,,,,,,,,,,,, -data/benchmark.zarr,6.21,6.29,8.11,7.48,9.39,9.07,8.739416,8.786544,8.765064,8.963036,16.83394,16.838632 -data/benchmark_compress.zarr,2.4,4.79,5.92,3.82,7.59,5.74,9.024708,9.311168,8.960372,9.131352,17.065612,16.960148 -data/benchmark_compress_shard.zarr,2.75,3.51,53.05,4.61,256.25,105.61,8.445184,8.932096,8.966272,8.497484,17.044724,16.981704 +data/benchmark.zarr,6.43,6.44,7.46,7.33,9.34,9.38,8.728816,8.8143,8.752556,8.959364,16.835044,16.83888 +data/benchmark_compress.zarr,2.8,4.7,5.82,3.53,7.33,5.74,9.025352,9.303976,8.951748,9.12464,17.067064,16.958868 +data/benchmark_compress_shard.zarr,2.68,3.16,53.12,4.17,80.11,5.53,8.445184,8.905268,8.974832,8.497144,17.013544,16.93396 diff --git a/measurements/benchmark_read_all.md b/measurements/benchmark_read_all.md index 993d60f..c2fdd7c 100644 --- a/measurements/benchmark_read_all.md +++ b/measurements/benchmark_read_all.md @@ -1,5 +1,5 @@ | Image | Time (s)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | Memory (GB)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | |:-----------------------------------|----------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:|-------------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:| -| data/benchmark.zarr | 6.21 | 6.29 | 8.11 | 7.48 | 9.39 | 9.07 | 8.74 | 8.79 | 8.77 | 8.96 | 16.83 | 16.84 | -| data/benchmark_compress.zarr | 2.40 | 4.79 | 5.92 | 3.82 | 7.59 | 5.74 | 9.02 | 9.31 | 8.96 | 9.13 | 17.07 | 16.96 | -| data/benchmark_compress_shard.zarr | 2.75 | 3.51 | 53.05 | 4.61 | 256.25 | 105.61 | 8.45 | 8.93 | 8.97 | 8.50 | 17.04 | 16.98 | \ No newline at end of file +| data/benchmark.zarr | 6.43 | 6.44 | 7.46 | 7.33 | 9.34 | 9.38 | 8.73 | 8.81 | 8.75 | 8.96 | 16.84 | 16.84 | +| data/benchmark_compress.zarr | 2.80 | 4.70 | 5.82 | 3.53 | 7.33 | 5.74 | 9.03 | 9.30 | 8.95 | 9.12 | 17.07 | 16.96 | +| data/benchmark_compress_shard.zarr | 2.68 | 3.16 | 53.12 | 4.17 | 80.11 | 5.53 | 8.45 | 8.91 | 8.97 | 8.50 | 17.01 | 16.93 | \ No newline at end of file diff --git a/scripts/zarr_dask_python_benchmark_read.py b/scripts/zarr_dask_python_benchmark_read.py index 2966b13..e66532a 100755 --- a/scripts/zarr_dask_python_benchmark_read.py +++ b/scripts/zarr_dask_python_benchmark_read.py @@ -19,8 +19,8 @@ def main(path, concurrent_chunks, read_all): # if "benchmark_compress_shard.zarr" in path: # sys.exit(1) - - arr = da.from_zarr(path) + z = zarr.open_array(path) + arr = da.from_zarr(path, chunks=z.shards) start_time = timeit.default_timer() if read_all: diff --git a/scripts/zarr_dask_python_benchmark_roundtrip.py b/scripts/zarr_dask_python_benchmark_roundtrip.py index f1e75f5..039934e 100755 --- a/scripts/zarr_dask_python_benchmark_roundtrip.py +++ b/scripts/zarr_dask_python_benchmark_roundtrip.py @@ -17,8 +17,9 @@ def main(path, output): # if "benchmark_compress_shard.zarr" in path: # sys.exit(1) + z = zarr.open_array(path) - arr = da.from_zarr(path) + arr = da.from_zarr(path, chunks=z.shards) start_time = timeit.default_timer() da.to_zarr(arr, output) elapsed = timeit.default_timer() - start_time diff --git a/scripts/zarr_python_benchmark_read.py b/scripts/zarr_python_benchmark_read.py index cb21af5..ce3c274 100755 --- a/scripts/zarr_python_benchmark_read.py +++ b/scripts/zarr_python_benchmark_read.py @@ -62,7 +62,7 @@ async def chunk_read(chunk_index): tg.create_task(chunk_read(chunk_index)) elif concurrent_chunks == 1: for chunk_index in np.ndindex(*num_chunks): - dataset.get_block_selection(chunk_index) + dataset[tuple(slice(i * s, (1 + i) * s) for i, s in zip(chunk_index, chunk_shape))] else: semaphore = asyncio.Semaphore(concurrent_chunks) async def chunk_read_concurrent_limit(chunk_index): diff --git a/scripts/zarrs_dask_python_benchmark_read.py b/scripts/zarrs_dask_python_benchmark_read.py index 35188e4..fbf030c 100755 --- a/scripts/zarrs_dask_python_benchmark_read.py +++ b/scripts/zarrs_dask_python_benchmark_read.py @@ -30,8 +30,8 @@ def main(path, concurrent_chunks, read_all): # if "benchmark_compress_shard.zarr" in path: # sys.exit(1) - - arr = da.from_zarr(path) + z = zarr.open_array(path) + arr = da.from_zarr(path, chunks=z.shards) start_time = timeit.default_timer() if read_all: diff --git a/scripts/zarrs_dask_python_benchmark_roundtrip.py b/scripts/zarrs_dask_python_benchmark_roundtrip.py index cd2c74d..16045b3 100755 --- a/scripts/zarrs_dask_python_benchmark_roundtrip.py +++ b/scripts/zarrs_dask_python_benchmark_roundtrip.py @@ -28,8 +28,8 @@ def main(path, output): # if "benchmark_compress_shard.zarr" in path: # sys.exit(1) - - arr = da.from_zarr(path) + z = zarr.open_array(path) + arr = da.from_zarr(path, chunks=z.shards) start_time = timeit.default_timer() da.to_zarr(arr, output) elapsed = timeit.default_timer() - start_time diff --git a/scripts/zarrs_python_benchmark_read.py b/scripts/zarrs_python_benchmark_read.py index 6a7733f..371d4eb 100755 --- a/scripts/zarrs_python_benchmark_read.py +++ b/scripts/zarrs_python_benchmark_read.py @@ -73,7 +73,7 @@ async def chunk_read(chunk_index): tg.create_task(chunk_read(chunk_index)) elif concurrent_chunks == 1: for chunk_index in np.ndindex(*num_chunks): - dataset.get_block_selection(chunk_index) + dataset[tuple(slice(i * s, (1 + i) * s) for i, s in zip(chunk_index, chunk_shape))] else: semaphore = asyncio.Semaphore(concurrent_chunks) async def chunk_read_concurrent_limit(chunk_index): From cf51fb93fde135476b645618ac64bdaee3038b67 Mon Sep 17 00:00:00 2001 From: Ilan Gold Date: Tue, 8 Apr 2025 13:53:29 +0000 Subject: [PATCH 3/7] (chore): upload more results --- measurements/benchmark_read_all.csv | 6 ++--- measurements/benchmark_read_all.md | 6 ++--- measurements/benchmark_read_chunks.csv | 36 +++++++++++++------------- measurements/benchmark_read_chunks.md | 36 +++++++++++++------------- measurements/benchmark_roundtrip.csv | 6 ++--- measurements/benchmark_roundtrip.md | 6 ++--- 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/measurements/benchmark_read_all.csv b/measurements/benchmark_read_all.csv index e296451..77b9249 100644 --- a/measurements/benchmark_read_all.csv +++ b/measurements/benchmark_read_all.csv @@ -1,6 +1,6 @@ Metric,Time (s),Time (s),Time (s),Time (s),Time (s),Time (s),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB) Implementation,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python Image,,,,,,,,,,,, -data/benchmark.zarr,6.43,6.44,7.46,7.33,9.34,9.38,8.728816,8.8143,8.752556,8.959364,16.835044,16.83888 -data/benchmark_compress.zarr,2.8,4.7,5.82,3.53,7.33,5.74,9.025352,9.303976,8.951748,9.12464,17.067064,16.958868 -data/benchmark_compress_shard.zarr,2.68,3.16,53.12,4.17,80.11,5.53,8.445184,8.905268,8.974832,8.497144,17.013544,16.93396 +data/benchmark.zarr,6.24,6.27,7.45,7.32,9.43,9.28,8.738108,8.773308,8.754912,8.958692,16.833864,16.838664 +data/benchmark_compress.zarr,2.22,3.24,5.22,3.12,6.79,5.79,9.007392,9.378232,8.930956,9.051736,17.062168,16.94462 +data/benchmark_compress_shard.zarr,2.51,2.96,48.7,4.0,73.38,5.16,8.445704,8.77788,8.960244,8.494844,16.965484,16.93406 diff --git a/measurements/benchmark_read_all.md b/measurements/benchmark_read_all.md index c2fdd7c..b8de497 100644 --- a/measurements/benchmark_read_all.md +++ b/measurements/benchmark_read_all.md @@ -1,5 +1,5 @@ | Image | Time (s)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | Memory (GB)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | |:-----------------------------------|----------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:|-------------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:| -| data/benchmark.zarr | 6.43 | 6.44 | 7.46 | 7.33 | 9.34 | 9.38 | 8.73 | 8.81 | 8.75 | 8.96 | 16.84 | 16.84 | -| data/benchmark_compress.zarr | 2.80 | 4.70 | 5.82 | 3.53 | 7.33 | 5.74 | 9.03 | 9.30 | 8.95 | 9.12 | 17.07 | 16.96 | -| data/benchmark_compress_shard.zarr | 2.68 | 3.16 | 53.12 | 4.17 | 80.11 | 5.53 | 8.45 | 8.91 | 8.97 | 8.50 | 17.01 | 16.93 | \ No newline at end of file +| data/benchmark.zarr | 6.24 | 6.27 | 7.45 | 7.32 | 9.43 | 9.28 | 8.74 | 8.77 | 8.75 | 8.96 | 16.83 | 16.84 | +| data/benchmark_compress.zarr | 2.22 | 3.24 | 5.22 | 3.12 | 6.79 | 5.79 | 9.01 | 9.38 | 8.93 | 9.05 | 17.06 | 16.94 | +| data/benchmark_compress_shard.zarr | 2.51 | 2.96 | 48.70 | 4.00 | 73.38 | 5.16 | 8.45 | 8.78 | 8.96 | 8.49 | 16.97 | 16.93 | \ No newline at end of file diff --git a/measurements/benchmark_read_chunks.csv b/measurements/benchmark_read_chunks.csv index eaa0d9e..657f9e0 100644 --- a/measurements/benchmark_read_chunks.csv +++ b/measurements/benchmark_read_chunks.csv @@ -1,21 +1,21 @@ Metric,,Time (s),Time (s),Time (s),Time (s),Time (s),Time (s),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB) Implementation,,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python Image,Concurrency,,,,,,,,,,,, -data/benchmark.zarr,1,4.1,5.46,5.0,6.45,5.52,6.74,0.038192,0.123992,0.115932,0.120476,0.124684,0.131216 -data/benchmark.zarr,2,2.43,3.26,3.25,3.89,3.42,3.76,0.073104,0.190044,0.183576,0.186528,0.19014,0.193088 -data/benchmark.zarr,4,1.62,2.46,2.71,2.55,2.82,2.71,0.136564,0.312456,0.312724,0.313584,0.321028,0.302072 -data/benchmark.zarr,8,1.54,2.2,2.68,2.61,3.18,2.63,0.258544,0.414088,0.574772,0.475676,0.57898,0.410292 -data/benchmark.zarr,16,1.5,2.18,2.85,2.48,3.17,2.65,0.522484,0.713756,1.05534,0.726668,1.036324,0.668352 -data/benchmark.zarr,32,1.54,2.36,2.92,2.5,3.2,2.68,0.771308,1.564,2.06194,1.253872,1.93922,1.20242 -data/benchmark_compress.zarr,1,4.6,6.49,6.06,5.98,6.16,6.33,0.048276,0.15028,0.131444,0.374032,0.135604,0.348036 -data/benchmark_compress.zarr,2,2.2,3.76,3.65,3.46,3.78,3.57,0.09458,0.219012,0.213024,0.423576,0.259176,0.412632 -data/benchmark_compress.zarr,4,1.13,2.4,2.56,2.21,2.5,2.27,0.177688,0.364212,0.46168,0.530944,0.407076,0.507436 -data/benchmark_compress.zarr,8,0.69,1.95,2.22,1.93,2.32,2.09,0.327952,0.582932,0.741816,0.696572,0.644508,0.62458 -data/benchmark_compress.zarr,16,0.71,1.94,2.22,1.92,2.42,2.06,0.512548,0.887996,1.176644,0.93344,1.207852,0.879792 -data/benchmark_compress.zarr,32,0.76,1.93,2.42,1.97,2.73,2.23,0.723472,1.533288,2.17394,1.475916,2.337784,1.352212 -data/benchmark_compress_shard.zarr,1,2.28,2.81,35.19,3.64,26.36,3.59,0.082008,0.136236,0.33542,0.137716,0.314544,0.14142 -data/benchmark_compress_shard.zarr,2,1.53,2.17,33.19,2.2,24.7,2.39,0.12454,0.178248,0.441248,0.209328,0.428516,0.19052 -data/benchmark_compress_shard.zarr,4,1.32,1.84,32.03,1.85,27.12,2.05,0.203408,0.265768,0.586076,0.305272,0.638644,0.305424 -data/benchmark_compress_shard.zarr,8,1.16,1.72,31.47,1.92,29.55,2.01,0.360468,0.41328,0.834048,0.466712,0.958224,0.42636 -data/benchmark_compress_shard.zarr,16,1.06,1.67,31.72,1.88,33.62,2.05,0.619252,0.522008,1.372836,0.70762,1.784544,0.674872 -data/benchmark_compress_shard.zarr,32,1.13,1.73,33.18,1.97,36.8,2.21,0.884464,0.912768,2.448768,1.228768,3.489496,1.234684 +data/benchmark.zarr,1,10.21,14.23,12.3,12.82,12.8,13.14,0.038148,0.117264,0.110584,0.113416,0.124108,0.12656 +data/benchmark.zarr,2,6.86,8.89,8.04,8.3,8.82,8.72,0.070392,0.182224,0.17666,0.178988,0.18922,0.191704 +data/benchmark.zarr,4,6.03,6.62,6.73,6.72,7.04,6.84,0.128684,0.294152,0.307552,0.302216,0.320144,0.307312 +data/benchmark.zarr,8,5.69,6.36,6.79,6.33,6.41,6.49,0.259376,0.438736,0.569588,0.528788,0.55122,0.532324 +data/benchmark.zarr,16,5.64,6.38,6.4,6.33,6.61,6.5,0.509424,0.532944,1.063988,0.915596,1.048156,0.927004 +data/benchmark.zarr,32,5.61,6.15,6.45,6.3,6.74,6.63,0.513568,0.60266,1.71046,1.540476,1.708652,1.555444 +data/benchmark_compress.zarr,1,10.18,15.08,12.97,12.77,13.12,12.94,0.045648,0.142268,0.124116,0.136376,0.13496,0.152684 +data/benchmark_compress.zarr,2,5.26,8.29,7.62,6.73,7.93,7.04,0.093308,0.221132,0.20422,0.202212,0.255528,0.229272 +data/benchmark_compress.zarr,4,2.84,5.02,5.2,3.88,4.85,4.52,0.171004,0.344696,0.389928,0.350712,0.447076,0.363364 +data/benchmark_compress.zarr,8,1.75,3.57,4.29,3.02,4.48,3.16,0.304904,0.537448,0.750364,0.613012,0.731064,0.5923 +data/benchmark_compress.zarr,16,1.51,3.55,4.68,3.01,4.97,3.13,0.49328,0.941136,1.20608,0.928108,1.294484,0.904056 +data/benchmark_compress.zarr,32,1.67,3.54,3.87,2.72,4.66,3.05,0.536856,0.944492,2.069632,1.485052,2.147016,1.378332 +data/benchmark_compress_shard.zarr,1,4.66,6.24,233.76,76.28999999999999,48.38,6.36,0.068292,0.113292,0.0678,0.0502,0.263828,0.134308 +data/benchmark_compress_shard.zarr,2,2.82,3.77,,,48.05,3.86,0.108412,0.159592,,,0.381036,0.191432 +data/benchmark_compress_shard.zarr,4,2.37,2.75,,,53.23,3.26,0.180996,0.235388,,,0.552104,0.257128 +data/benchmark_compress_shard.zarr,8,2.19,2.57,,,51.46,2.5,0.30236,0.309316,,,0.926132,0.433432 +data/benchmark_compress_shard.zarr,16,1.84,2.42,,,62.87,2.39,0.522992,0.396512,,,1.768244,0.741888 +data/benchmark_compress_shard.zarr,32,1.8,2.49,,,71.33,2.27,0.563704,0.50286,,,3.49356,1.29274 diff --git a/measurements/benchmark_read_chunks.md b/measurements/benchmark_read_chunks.md index a72c0bd..1370e91 100644 --- a/measurements/benchmark_read_chunks.md +++ b/measurements/benchmark_read_chunks.md @@ -1,20 +1,20 @@ | | Image | Concurrency | Time (s)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | Memory (GB)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | |---:|:-----------------------------------|--------------:|----------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:|-------------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:| -| 0 | data/benchmark.zarr | 1 | 4.10 | 5.46 | 5.00 | 6.45 | 5.52 | 6.74 | 0.04 | 0.12 | 0.12 | 0.12 | 0.12 | 0.13 | -| 1 | data/benchmark.zarr | 2 | 2.43 | 3.26 | 3.25 | 3.89 | 3.42 | 3.76 | 0.07 | 0.19 | 0.18 | 0.19 | 0.19 | 0.19 | -| 2 | data/benchmark.zarr | 4 | 1.62 | 2.46 | 2.71 | 2.55 | 2.82 | 2.71 | 0.14 | 0.31 | 0.31 | 0.31 | 0.32 | 0.30 | -| 3 | data/benchmark.zarr | 8 | 1.54 | 2.20 | 2.68 | 2.61 | 3.18 | 2.63 | 0.26 | 0.41 | 0.57 | 0.48 | 0.58 | 0.41 | -| 4 | data/benchmark.zarr | 16 | 1.50 | 2.18 | 2.85 | 2.48 | 3.17 | 2.65 | 0.52 | 0.71 | 1.06 | 0.73 | 1.04 | 0.67 | -| 5 | data/benchmark.zarr | 32 | 1.54 | 2.36 | 2.92 | 2.50 | 3.20 | 2.68 | 0.77 | 1.56 | 2.06 | 1.25 | 1.94 | 1.20 | -| 6 | data/benchmark_compress.zarr | 1 | 4.60 | 6.49 | 6.06 | 5.98 | 6.16 | 6.33 | 0.05 | 0.15 | 0.13 | 0.37 | 0.14 | 0.35 | -| 7 | data/benchmark_compress.zarr | 2 | 2.20 | 3.76 | 3.65 | 3.46 | 3.78 | 3.57 | 0.09 | 0.22 | 0.21 | 0.42 | 0.26 | 0.41 | -| 8 | data/benchmark_compress.zarr | 4 | 1.13 | 2.40 | 2.56 | 2.21 | 2.50 | 2.27 | 0.18 | 0.36 | 0.46 | 0.53 | 0.41 | 0.51 | -| 9 | data/benchmark_compress.zarr | 8 | 0.69 | 1.95 | 2.22 | 1.93 | 2.32 | 2.09 | 0.33 | 0.58 | 0.74 | 0.70 | 0.64 | 0.62 | -| 10 | data/benchmark_compress.zarr | 16 | 0.71 | 1.94 | 2.22 | 1.92 | 2.42 | 2.06 | 0.51 | 0.89 | 1.18 | 0.93 | 1.21 | 0.88 | -| 11 | data/benchmark_compress.zarr | 32 | 0.76 | 1.93 | 2.42 | 1.97 | 2.73 | 2.23 | 0.72 | 1.53 | 2.17 | 1.48 | 2.34 | 1.35 | -| 12 | data/benchmark_compress_shard.zarr | 1 | 2.28 | 2.81 | 35.19 | 3.64 | 26.36 | 3.59 | 0.08 | 0.14 | 0.34 | 0.14 | 0.31 | 0.14 | -| 13 | data/benchmark_compress_shard.zarr | 2 | 1.53 | 2.17 | 33.19 | 2.20 | 24.70 | 2.39 | 0.12 | 0.18 | 0.44 | 0.21 | 0.43 | 0.19 | -| 14 | data/benchmark_compress_shard.zarr | 4 | 1.32 | 1.84 | 32.03 | 1.85 | 27.12 | 2.05 | 0.20 | 0.27 | 0.59 | 0.31 | 0.64 | 0.31 | -| 15 | data/benchmark_compress_shard.zarr | 8 | 1.16 | 1.72 | 31.47 | 1.92 | 29.55 | 2.01 | 0.36 | 0.41 | 0.83 | 0.47 | 0.96 | 0.43 | -| 16 | data/benchmark_compress_shard.zarr | 16 | 1.06 | 1.67 | 31.72 | 1.88 | 33.62 | 2.05 | 0.62 | 0.52 | 1.37 | 0.71 | 1.78 | 0.67 | -| 17 | data/benchmark_compress_shard.zarr | 32 | 1.13 | 1.73 | 33.18 | 1.97 | 36.80 | 2.21 | 0.88 | 0.91 | 2.45 | 1.23 | 3.49 | 1.23 | \ No newline at end of file +| 0 | data/benchmark.zarr | 1 | 10.21 | 14.23 | 12.30 | 12.82 | 12.80 | 13.14 | 0.04 | 0.12 | 0.11 | 0.11 | 0.12 | 0.13 | +| 1 | data/benchmark.zarr | 2 | 6.86 | 8.89 | 8.04 | 8.30 | 8.82 | 8.72 | 0.07 | 0.18 | 0.18 | 0.18 | 0.19 | 0.19 | +| 2 | data/benchmark.zarr | 4 | 6.03 | 6.62 | 6.73 | 6.72 | 7.04 | 6.84 | 0.13 | 0.29 | 0.31 | 0.30 | 0.32 | 0.31 | +| 3 | data/benchmark.zarr | 8 | 5.69 | 6.36 | 6.79 | 6.33 | 6.41 | 6.49 | 0.26 | 0.44 | 0.57 | 0.53 | 0.55 | 0.53 | +| 4 | data/benchmark.zarr | 16 | 5.64 | 6.38 | 6.40 | 6.33 | 6.61 | 6.50 | 0.51 | 0.53 | 1.06 | 0.92 | 1.05 | 0.93 | +| 5 | data/benchmark.zarr | 32 | 5.61 | 6.15 | 6.45 | 6.30 | 6.74 | 6.63 | 0.51 | 0.60 | 1.71 | 1.54 | 1.71 | 1.56 | +| 6 | data/benchmark_compress.zarr | 1 | 10.18 | 15.08 | 12.97 | 12.77 | 13.12 | 12.94 | 0.05 | 0.14 | 0.12 | 0.14 | 0.13 | 0.15 | +| 7 | data/benchmark_compress.zarr | 2 | 5.26 | 8.29 | 7.62 | 6.73 | 7.93 | 7.04 | 0.09 | 0.22 | 0.20 | 0.20 | 0.26 | 0.23 | +| 8 | data/benchmark_compress.zarr | 4 | 2.84 | 5.02 | 5.20 | 3.88 | 4.85 | 4.52 | 0.17 | 0.34 | 0.39 | 0.35 | 0.45 | 0.36 | +| 9 | data/benchmark_compress.zarr | 8 | 1.75 | 3.57 | 4.29 | 3.02 | 4.48 | 3.16 | 0.30 | 0.54 | 0.75 | 0.61 | 0.73 | 0.59 | +| 10 | data/benchmark_compress.zarr | 16 | 1.51 | 3.55 | 4.68 | 3.01 | 4.97 | 3.13 | 0.49 | 0.94 | 1.21 | 0.93 | 1.29 | 0.90 | +| 11 | data/benchmark_compress.zarr | 32 | 1.67 | 3.54 | 3.87 | 2.72 | 4.66 | 3.05 | 0.54 | 0.94 | 2.07 | 1.49 | 2.15 | 1.38 | +| 12 | data/benchmark_compress_shard.zarr | 1 | 4.66 | 6.24 | 233.76 | 76.29 | 48.38 | 6.36 | 0.07 | 0.11 | 0.07 | 0.05 | 0.26 | 0.13 | +| 13 | data/benchmark_compress_shard.zarr | 2 | 2.82 | 3.77 | nan | nan | 48.05 | 3.86 | 0.11 | 0.16 | nan | nan | 0.38 | 0.19 | +| 14 | data/benchmark_compress_shard.zarr | 4 | 2.37 | 2.75 | nan | nan | 53.23 | 3.26 | 0.18 | 0.24 | nan | nan | 0.55 | 0.26 | +| 15 | data/benchmark_compress_shard.zarr | 8 | 2.19 | 2.57 | nan | nan | 51.46 | 2.50 | 0.30 | 0.31 | nan | nan | 0.93 | 0.43 | +| 16 | data/benchmark_compress_shard.zarr | 16 | 1.84 | 2.42 | nan | nan | 62.87 | 2.39 | 0.52 | 0.40 | nan | nan | 1.77 | 0.74 | +| 17 | data/benchmark_compress_shard.zarr | 32 | 1.80 | 2.49 | nan | nan | 71.33 | 2.27 | 0.56 | 0.50 | nan | nan | 3.49 | 1.29 | \ No newline at end of file diff --git a/measurements/benchmark_roundtrip.csv b/measurements/benchmark_roundtrip.csv index 4e03b0f..23ef36f 100644 --- a/measurements/benchmark_roundtrip.csv +++ b/measurements/benchmark_roundtrip.csv @@ -1,6 +1,6 @@ Metric,Time (s),Time (s),Time (s),Time (s),Time (s),Time (s),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB) Implementation,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python Image,,,,,,,,,,,, -data/benchmark.zarr,2.3,8.28,17.78,4.94,15.38,4.17,0.792712,0.883052,9.031084,9.266244,1.621484,1.561132 -data/benchmark_compress.zarr,1.3,7.71,14.65,4.1,15.24,3.59,1.052528,1.612392,9.13668,9.548896,1.613448,1.580084 -data/benchmark_compress_shard.zarr,2.97,4.87,142.37,4.27,46.56,3.65,0.22328,2.32528,9.0285,8.661988,2.644088,1.53796 +data/benchmark.zarr,7.15,24.29,30.02,9.22,19.22,6.97,0.530032,0.6095,9.02362,8.984892,1.172144,1.168724 +data/benchmark_compress.zarr,1.99,19.77,25.58,5.11,19.22,5.14,0.667604,1.100852,8.999616,9.156616,1.205748,1.220156 +data/benchmark_compress_shard.zarr,4.43,9.06,230.85,10.89,65.35,4.03,0.205796,2.274032,8.967224,8.712456,1.752088,1.177628 diff --git a/measurements/benchmark_roundtrip.md b/measurements/benchmark_roundtrip.md index 2b191a9..adbbcfb 100644 --- a/measurements/benchmark_roundtrip.md +++ b/measurements/benchmark_roundtrip.md @@ -1,5 +1,5 @@ | Image | Time (s)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | Memory (GB)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | |:-----------------------------------|----------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:|-------------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:| -| data/benchmark.zarr | 2.30 | 8.28 | 17.78 | 4.94 | 15.38 | 4.17 | 0.79 | 0.88 | 9.03 | 9.27 | 1.62 | 1.56 | -| data/benchmark_compress.zarr | 1.30 | 7.71 | 14.65 | 4.10 | 15.24 | 3.59 | 1.05 | 1.61 | 9.14 | 9.55 | 1.61 | 1.58 | -| data/benchmark_compress_shard.zarr | 2.97 | 4.87 | 142.37 | 4.27 | 46.56 | 3.65 | 0.22 | 2.33 | 9.03 | 8.66 | 2.64 | 1.54 | \ No newline at end of file +| data/benchmark.zarr | 7.15 | 24.29 | 30.02 | 9.22 | 19.22 | 6.97 | 0.53 | 0.61 | 9.02 | 8.98 | 1.17 | 1.17 | +| data/benchmark_compress.zarr | 1.99 | 19.77 | 25.58 | 5.11 | 19.22 | 5.14 | 0.67 | 1.10 | 9.00 | 9.16 | 1.21 | 1.22 | +| data/benchmark_compress_shard.zarr | 4.43 | 9.06 | 230.85 | 10.89 | 65.35 | 4.03 | 0.21 | 2.27 | 8.97 | 8.71 | 1.75 | 1.18 | \ No newline at end of file From 86ba172b0a9f3d82e37743295f71ec34d0702255 Mon Sep 17 00:00:00 2001 From: Lachlan Deakin Date: Thu, 17 Apr 2025 15:47:25 +1000 Subject: [PATCH 4/7] fix: use shard shape in non-dask benchmarks --- scripts/zarr_python_benchmark_read.py | 2 +- scripts/zarrs_python_benchmark_read.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/zarr_python_benchmark_read.py b/scripts/zarr_python_benchmark_read.py index ce3c274..367b9b0 100755 --- a/scripts/zarr_python_benchmark_read.py +++ b/scripts/zarr_python_benchmark_read.py @@ -40,7 +40,7 @@ async def main(path, concurrent_chunks, read_all): dataset = zarr.open(store=store, mode='r') domain_shape = dataset.shape - chunk_shape = dataset.chunks + chunk_shape = dataset.shards or dataset.chunks print("Domain shape", domain_shape) print("Chunk shape", chunk_shape) diff --git a/scripts/zarrs_python_benchmark_read.py b/scripts/zarrs_python_benchmark_read.py index 371d4eb..9fdef17 100755 --- a/scripts/zarrs_python_benchmark_read.py +++ b/scripts/zarrs_python_benchmark_read.py @@ -51,7 +51,7 @@ async def main(path, concurrent_chunks, read_all): dataset = zarr.open(store=store, mode='r') domain_shape = dataset.shape - chunk_shape = dataset.chunks + chunk_shape = dataset.shards or dataset.chunks print("Domain shape", domain_shape) print("Chunk shape", chunk_shape) From d1e6a9f978a448a4594b5bed6d4a33fb33a9eb77 Mon Sep 17 00:00:00 2001 From: Lachlan Deakin Date: Thu, 17 Apr 2025 15:47:37 +1000 Subject: [PATCH 5/7] chore: bump all deps --- makefile | 2 +- requirements.txt | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/makefile b/makefile index 5fb5ffa..46d369b 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ setup: uv venv --python 3.12 uv pip install -r requirements.txt - cargo binstall zarrs_tools@0.6.0-beta.1 + cargo binstall zarrs_tools@0.7.1 binstall: curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash diff --git a/requirements.txt b/requirements.txt index 60d83a9..be5424e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,11 @@ -click==8.1.7 -numpy==1.26.4 -dask==2024.11.2 -xarray==2024.10.0 +click==8.1.8 +numpy==2.2.4 +dask==2025.3.0 +xarray==2025.3.1 # xarray-tensorstore==0.1.5 zarr==3.0.6 zarrs==0.1.3 pandas==2.2.3 tabulate==0.9.0 -tensorstore==0.1.67 -matplotlib==3.9.2 +tensorstore==0.1.73 +matplotlib==3.10.1 From 4b2fe7391aa522bef20f9e2922261d71c56a137d Mon Sep 17 00:00:00 2001 From: Lachlan Deakin Date: Thu, 17 Apr 2025 15:48:11 +1000 Subject: [PATCH 6/7] chore: add updated benchmarks --- measurements/benchmark_read_all.csv | 6 ++--- measurements/benchmark_read_all.md | 6 ++--- measurements/benchmark_read_chunks.csv | 36 +++++++++++++------------- measurements/benchmark_read_chunks.md | 36 +++++++++++++------------- measurements/benchmark_roundtrip.csv | 6 ++--- measurements/benchmark_roundtrip.md | 6 ++--- 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/measurements/benchmark_read_all.csv b/measurements/benchmark_read_all.csv index 77b9249..e10be4a 100644 --- a/measurements/benchmark_read_all.csv +++ b/measurements/benchmark_read_all.csv @@ -1,6 +1,6 @@ Metric,Time (s),Time (s),Time (s),Time (s),Time (s),Time (s),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB) Implementation,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python Image,,,,,,,,,,,, -data/benchmark.zarr,6.24,6.27,7.45,7.32,9.43,9.28,8.738108,8.773308,8.754912,8.958692,16.833864,16.838664 -data/benchmark_compress.zarr,2.22,3.24,5.22,3.12,6.79,5.79,9.007392,9.378232,8.930956,9.051736,17.062168,16.94462 -data/benchmark_compress_shard.zarr,2.51,2.96,48.7,4.0,73.38,5.16,8.445704,8.77788,8.960244,8.494844,16.965484,16.93406 +data/benchmark.zarr,2.39,2.88,3.1,2.99,5.21,4.92,9.1216,11.357908,8.751452,9.225376,16.881816,16.886612 +data/benchmark_compress.zarr,2.13,2.51,3.12,2.57,5.25,4.55,9.366084,9.5691,8.987,9.405832,17.160644,16.998852 +data/benchmark_compress_shard.zarr,1.61,2.05,29.54,2.26,44.98,4.33,8.457372,8.621676,9.01544,8.510408,17.066332,16.984744 diff --git a/measurements/benchmark_read_all.md b/measurements/benchmark_read_all.md index b8de497..356def1 100644 --- a/measurements/benchmark_read_all.md +++ b/measurements/benchmark_read_all.md @@ -1,5 +1,5 @@ | Image | Time (s)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | Memory (GB)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | |:-----------------------------------|----------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:|-------------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:| -| data/benchmark.zarr | 6.24 | 6.27 | 7.45 | 7.32 | 9.43 | 9.28 | 8.74 | 8.77 | 8.75 | 8.96 | 16.83 | 16.84 | -| data/benchmark_compress.zarr | 2.22 | 3.24 | 5.22 | 3.12 | 6.79 | 5.79 | 9.01 | 9.38 | 8.93 | 9.05 | 17.06 | 16.94 | -| data/benchmark_compress_shard.zarr | 2.51 | 2.96 | 48.70 | 4.00 | 73.38 | 5.16 | 8.45 | 8.78 | 8.96 | 8.49 | 16.97 | 16.93 | \ No newline at end of file +| data/benchmark.zarr | 2.39 | 2.88 | 3.10 | 2.99 | 5.21 | 4.92 | 9.12 | 11.36 | 8.75 | 9.23 | 16.88 | 16.89 | +| data/benchmark_compress.zarr | 2.13 | 2.51 | 3.12 | 2.57 | 5.25 | 4.55 | 9.37 | 9.57 | 8.99 | 9.41 | 17.16 | 17.00 | +| data/benchmark_compress_shard.zarr | 1.61 | 2.05 | 29.54 | 2.26 | 44.98 | 4.33 | 8.46 | 8.62 | 9.02 | 8.51 | 17.07 | 16.98 | \ No newline at end of file diff --git a/measurements/benchmark_read_chunks.csv b/measurements/benchmark_read_chunks.csv index 657f9e0..10bafde 100644 --- a/measurements/benchmark_read_chunks.csv +++ b/measurements/benchmark_read_chunks.csv @@ -1,21 +1,21 @@ Metric,,Time (s),Time (s),Time (s),Time (s),Time (s),Time (s),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB) Implementation,,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python Image,Concurrency,,,,,,,,,,,, -data/benchmark.zarr,1,10.21,14.23,12.3,12.82,12.8,13.14,0.038148,0.117264,0.110584,0.113416,0.124108,0.12656 -data/benchmark.zarr,2,6.86,8.89,8.04,8.3,8.82,8.72,0.070392,0.182224,0.17666,0.178988,0.18922,0.191704 -data/benchmark.zarr,4,6.03,6.62,6.73,6.72,7.04,6.84,0.128684,0.294152,0.307552,0.302216,0.320144,0.307312 -data/benchmark.zarr,8,5.69,6.36,6.79,6.33,6.41,6.49,0.259376,0.438736,0.569588,0.528788,0.55122,0.532324 -data/benchmark.zarr,16,5.64,6.38,6.4,6.33,6.61,6.5,0.509424,0.532944,1.063988,0.915596,1.048156,0.927004 -data/benchmark.zarr,32,5.61,6.15,6.45,6.3,6.74,6.63,0.513568,0.60266,1.71046,1.540476,1.708652,1.555444 -data/benchmark_compress.zarr,1,10.18,15.08,12.97,12.77,13.12,12.94,0.045648,0.142268,0.124116,0.136376,0.13496,0.152684 -data/benchmark_compress.zarr,2,5.26,8.29,7.62,6.73,7.93,7.04,0.093308,0.221132,0.20422,0.202212,0.255528,0.229272 -data/benchmark_compress.zarr,4,2.84,5.02,5.2,3.88,4.85,4.52,0.171004,0.344696,0.389928,0.350712,0.447076,0.363364 -data/benchmark_compress.zarr,8,1.75,3.57,4.29,3.02,4.48,3.16,0.304904,0.537448,0.750364,0.613012,0.731064,0.5923 -data/benchmark_compress.zarr,16,1.51,3.55,4.68,3.01,4.97,3.13,0.49328,0.941136,1.20608,0.928108,1.294484,0.904056 -data/benchmark_compress.zarr,32,1.67,3.54,3.87,2.72,4.66,3.05,0.536856,0.944492,2.069632,1.485052,2.147016,1.378332 -data/benchmark_compress_shard.zarr,1,4.66,6.24,233.76,76.28999999999999,48.38,6.36,0.068292,0.113292,0.0678,0.0502,0.263828,0.134308 -data/benchmark_compress_shard.zarr,2,2.82,3.77,,,48.05,3.86,0.108412,0.159592,,,0.381036,0.191432 -data/benchmark_compress_shard.zarr,4,2.37,2.75,,,53.23,3.26,0.180996,0.235388,,,0.552104,0.257128 -data/benchmark_compress_shard.zarr,8,2.19,2.57,,,51.46,2.5,0.30236,0.309316,,,0.926132,0.433432 -data/benchmark_compress_shard.zarr,16,1.84,2.42,,,62.87,2.39,0.522992,0.396512,,,1.768244,0.741888 -data/benchmark_compress_shard.zarr,32,1.8,2.49,,,71.33,2.27,0.563704,0.50286,,,3.49356,1.29274 +data/benchmark.zarr,1,4.76,5.74,4.93,6.62,5.64,6.9,0.038416,0.119924,0.113,0.1173,0.16642,0.168356 +data/benchmark.zarr,2,2.28,3.49,3.01,3.68,3.62,4.01,0.071064,0.186696,0.178636,0.183236,0.231764,0.235456 +data/benchmark.zarr,4,1.57,2.43,2.75,2.54,3.14,3.27,0.130256,0.318244,0.313612,0.31204,0.364584,0.349972 +data/benchmark.zarr,8,1.53,2.15,2.74,2.63,3.11,2.76,0.249144,0.407156,0.5737,0.454324,0.598492,0.483656 +data/benchmark.zarr,16,1.56,2.03,2.8,2.34,3.35,2.94,0.514944,0.739828,1.029564,0.7405,1.030476,0.721012 +data/benchmark.zarr,32,1.6,2.43,2.88,2.39,3.28,3.09,0.78834,1.627972,2.048828,1.280544,2.043356,1.241544 +data/benchmark_compress.zarr,1,4.11,5.64,6.25,5.66,6.77,6.35,0.047556,0.145592,0.128384,0.14066,0.17968,0.195464 +data/benchmark_compress.zarr,2,2.05,3.27,3.63,3.14,4.03,3.69,0.095644,0.229376,0.211856,0.220604,0.288052,0.26788 +data/benchmark_compress.zarr,4,1.1,1.98,2.52,2.14,2.8,2.55,0.164932,0.367956,0.430372,0.379696,0.44482,0.380744 +data/benchmark_compress.zarr,8,0.69,1.51,2.21,1.93,2.64,2.37,0.301296,0.516724,0.732408,0.591456,0.792676,0.565356 +data/benchmark_compress.zarr,16,0.74,1.59,2.19,1.92,2.64,2.36,0.5247,0.827748,1.260192,0.867852,1.250276,0.818392 +data/benchmark_compress.zarr,32,0.79,1.63,2.33,1.94,2.78,2.37,0.688444,1.424012,2.18272,1.33024,2.164008,1.313892 +data/benchmark_compress_shard.zarr,1,2.42,2.81,36.58,3.57,28.63,3.86,0.081292,0.137776,0.309596,0.136036,0.354168,0.18636 +data/benchmark_compress_shard.zarr,2,1.65,2.23,31.37,2.17,27.13,2.76,0.120428,0.17838,0.427832,0.208684,0.470932,0.224104 +data/benchmark_compress_shard.zarr,4,1.31,1.92,30.28,1.91,29.61,2.32,0.204636,0.26516,0.583808,0.313416,0.648056,0.312048 +data/benchmark_compress_shard.zarr,8,1.16,1.79,29.38,1.78,33.13,2.21,0.362204,0.387804,0.840772,0.456744,0.995296,0.460824 +data/benchmark_compress_shard.zarr,16,1.12,1.73,30.11,1.82,36.78,2.22,0.609532,0.545428,1.395968,0.737816,1.817132,0.720144 +data/benchmark_compress_shard.zarr,32,1.17,1.72,31.79,1.76,39.55,2.27,0.883988,0.903796,2.491672,1.246516,3.559228,1.233076 diff --git a/measurements/benchmark_read_chunks.md b/measurements/benchmark_read_chunks.md index 1370e91..62a556c 100644 --- a/measurements/benchmark_read_chunks.md +++ b/measurements/benchmark_read_chunks.md @@ -1,20 +1,20 @@ | | Image | Concurrency | Time (s)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | Memory (GB)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | |---:|:-----------------------------------|--------------:|----------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:|-------------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:| -| 0 | data/benchmark.zarr | 1 | 10.21 | 14.23 | 12.30 | 12.82 | 12.80 | 13.14 | 0.04 | 0.12 | 0.11 | 0.11 | 0.12 | 0.13 | -| 1 | data/benchmark.zarr | 2 | 6.86 | 8.89 | 8.04 | 8.30 | 8.82 | 8.72 | 0.07 | 0.18 | 0.18 | 0.18 | 0.19 | 0.19 | -| 2 | data/benchmark.zarr | 4 | 6.03 | 6.62 | 6.73 | 6.72 | 7.04 | 6.84 | 0.13 | 0.29 | 0.31 | 0.30 | 0.32 | 0.31 | -| 3 | data/benchmark.zarr | 8 | 5.69 | 6.36 | 6.79 | 6.33 | 6.41 | 6.49 | 0.26 | 0.44 | 0.57 | 0.53 | 0.55 | 0.53 | -| 4 | data/benchmark.zarr | 16 | 5.64 | 6.38 | 6.40 | 6.33 | 6.61 | 6.50 | 0.51 | 0.53 | 1.06 | 0.92 | 1.05 | 0.93 | -| 5 | data/benchmark.zarr | 32 | 5.61 | 6.15 | 6.45 | 6.30 | 6.74 | 6.63 | 0.51 | 0.60 | 1.71 | 1.54 | 1.71 | 1.56 | -| 6 | data/benchmark_compress.zarr | 1 | 10.18 | 15.08 | 12.97 | 12.77 | 13.12 | 12.94 | 0.05 | 0.14 | 0.12 | 0.14 | 0.13 | 0.15 | -| 7 | data/benchmark_compress.zarr | 2 | 5.26 | 8.29 | 7.62 | 6.73 | 7.93 | 7.04 | 0.09 | 0.22 | 0.20 | 0.20 | 0.26 | 0.23 | -| 8 | data/benchmark_compress.zarr | 4 | 2.84 | 5.02 | 5.20 | 3.88 | 4.85 | 4.52 | 0.17 | 0.34 | 0.39 | 0.35 | 0.45 | 0.36 | -| 9 | data/benchmark_compress.zarr | 8 | 1.75 | 3.57 | 4.29 | 3.02 | 4.48 | 3.16 | 0.30 | 0.54 | 0.75 | 0.61 | 0.73 | 0.59 | -| 10 | data/benchmark_compress.zarr | 16 | 1.51 | 3.55 | 4.68 | 3.01 | 4.97 | 3.13 | 0.49 | 0.94 | 1.21 | 0.93 | 1.29 | 0.90 | -| 11 | data/benchmark_compress.zarr | 32 | 1.67 | 3.54 | 3.87 | 2.72 | 4.66 | 3.05 | 0.54 | 0.94 | 2.07 | 1.49 | 2.15 | 1.38 | -| 12 | data/benchmark_compress_shard.zarr | 1 | 4.66 | 6.24 | 233.76 | 76.29 | 48.38 | 6.36 | 0.07 | 0.11 | 0.07 | 0.05 | 0.26 | 0.13 | -| 13 | data/benchmark_compress_shard.zarr | 2 | 2.82 | 3.77 | nan | nan | 48.05 | 3.86 | 0.11 | 0.16 | nan | nan | 0.38 | 0.19 | -| 14 | data/benchmark_compress_shard.zarr | 4 | 2.37 | 2.75 | nan | nan | 53.23 | 3.26 | 0.18 | 0.24 | nan | nan | 0.55 | 0.26 | -| 15 | data/benchmark_compress_shard.zarr | 8 | 2.19 | 2.57 | nan | nan | 51.46 | 2.50 | 0.30 | 0.31 | nan | nan | 0.93 | 0.43 | -| 16 | data/benchmark_compress_shard.zarr | 16 | 1.84 | 2.42 | nan | nan | 62.87 | 2.39 | 0.52 | 0.40 | nan | nan | 1.77 | 0.74 | -| 17 | data/benchmark_compress_shard.zarr | 32 | 1.80 | 2.49 | nan | nan | 71.33 | 2.27 | 0.56 | 0.50 | nan | nan | 3.49 | 1.29 | \ No newline at end of file +| 0 | data/benchmark.zarr | 1 | 4.76 | 5.74 | 4.93 | 6.62 | 5.64 | 6.90 | 0.04 | 0.12 | 0.11 | 0.12 | 0.17 | 0.17 | +| 1 | data/benchmark.zarr | 2 | 2.28 | 3.49 | 3.01 | 3.68 | 3.62 | 4.01 | 0.07 | 0.19 | 0.18 | 0.18 | 0.23 | 0.24 | +| 2 | data/benchmark.zarr | 4 | 1.57 | 2.43 | 2.75 | 2.54 | 3.14 | 3.27 | 0.13 | 0.32 | 0.31 | 0.31 | 0.36 | 0.35 | +| 3 | data/benchmark.zarr | 8 | 1.53 | 2.15 | 2.74 | 2.63 | 3.11 | 2.76 | 0.25 | 0.41 | 0.57 | 0.45 | 0.60 | 0.48 | +| 4 | data/benchmark.zarr | 16 | 1.56 | 2.03 | 2.80 | 2.34 | 3.35 | 2.94 | 0.51 | 0.74 | 1.03 | 0.74 | 1.03 | 0.72 | +| 5 | data/benchmark.zarr | 32 | 1.60 | 2.43 | 2.88 | 2.39 | 3.28 | 3.09 | 0.79 | 1.63 | 2.05 | 1.28 | 2.04 | 1.24 | +| 6 | data/benchmark_compress.zarr | 1 | 4.11 | 5.64 | 6.25 | 5.66 | 6.77 | 6.35 | 0.05 | 0.15 | 0.13 | 0.14 | 0.18 | 0.20 | +| 7 | data/benchmark_compress.zarr | 2 | 2.05 | 3.27 | 3.63 | 3.14 | 4.03 | 3.69 | 0.10 | 0.23 | 0.21 | 0.22 | 0.29 | 0.27 | +| 8 | data/benchmark_compress.zarr | 4 | 1.10 | 1.98 | 2.52 | 2.14 | 2.80 | 2.55 | 0.16 | 0.37 | 0.43 | 0.38 | 0.44 | 0.38 | +| 9 | data/benchmark_compress.zarr | 8 | 0.69 | 1.51 | 2.21 | 1.93 | 2.64 | 2.37 | 0.30 | 0.52 | 0.73 | 0.59 | 0.79 | 0.57 | +| 10 | data/benchmark_compress.zarr | 16 | 0.74 | 1.59 | 2.19 | 1.92 | 2.64 | 2.36 | 0.52 | 0.83 | 1.26 | 0.87 | 1.25 | 0.82 | +| 11 | data/benchmark_compress.zarr | 32 | 0.79 | 1.63 | 2.33 | 1.94 | 2.78 | 2.37 | 0.69 | 1.42 | 2.18 | 1.33 | 2.16 | 1.31 | +| 12 | data/benchmark_compress_shard.zarr | 1 | 2.42 | 2.81 | 36.58 | 3.57 | 28.63 | 3.86 | 0.08 | 0.14 | 0.31 | 0.14 | 0.35 | 0.19 | +| 13 | data/benchmark_compress_shard.zarr | 2 | 1.65 | 2.23 | 31.37 | 2.17 | 27.13 | 2.76 | 0.12 | 0.18 | 0.43 | 0.21 | 0.47 | 0.22 | +| 14 | data/benchmark_compress_shard.zarr | 4 | 1.31 | 1.92 | 30.28 | 1.91 | 29.61 | 2.32 | 0.20 | 0.27 | 0.58 | 0.31 | 0.65 | 0.31 | +| 15 | data/benchmark_compress_shard.zarr | 8 | 1.16 | 1.79 | 29.38 | 1.78 | 33.13 | 2.21 | 0.36 | 0.39 | 0.84 | 0.46 | 1.00 | 0.46 | +| 16 | data/benchmark_compress_shard.zarr | 16 | 1.12 | 1.73 | 30.11 | 1.82 | 36.78 | 2.22 | 0.61 | 0.55 | 1.40 | 0.74 | 1.82 | 0.72 | +| 17 | data/benchmark_compress_shard.zarr | 32 | 1.17 | 1.72 | 31.79 | 1.76 | 39.55 | 2.27 | 0.88 | 0.90 | 2.49 | 1.25 | 3.56 | 1.23 | \ No newline at end of file diff --git a/measurements/benchmark_roundtrip.csv b/measurements/benchmark_roundtrip.csv index 23ef36f..3148371 100644 --- a/measurements/benchmark_roundtrip.csv +++ b/measurements/benchmark_roundtrip.csv @@ -1,6 +1,6 @@ Metric,Time (s),Time (s),Time (s),Time (s),Time (s),Time (s),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB),Memory (GB) Implementation,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python,zarrs_rust,tensorstore_python,zarr_python,zarrs_python,zarr_dask_python,zarrs_dask_python Image,,,,,,,,,,,, -data/benchmark.zarr,7.15,24.29,30.02,9.22,19.22,6.97,0.530032,0.6095,9.02362,8.984892,1.172144,1.168724 -data/benchmark_compress.zarr,1.99,19.77,25.58,5.11,19.22,5.14,0.667604,1.100852,8.999616,9.156616,1.205748,1.220156 -data/benchmark_compress_shard.zarr,4.43,9.06,230.85,10.89,65.35,4.03,0.205796,2.274032,8.967224,8.712456,1.752088,1.177628 +data/benchmark.zarr,2.27,9.7,18.47,5.01,11.36,3.88,0.79338,0.879184,9.0254,9.259884,1.534688,1.78304 +data/benchmark_compress.zarr,1.3,6.76,15.34,4.09,10.63,3.54,1.060276,1.157956,9.009768,9.5209,1.762008,1.586404 +data/benchmark_compress_shard.zarr,2.84,3.75,180.9,6.62,45.65,3.33,0.22384,1.53856,9.017404,8.722708,2.675728,1.574932 diff --git a/measurements/benchmark_roundtrip.md b/measurements/benchmark_roundtrip.md index adbbcfb..f869259 100644 --- a/measurements/benchmark_roundtrip.md +++ b/measurements/benchmark_roundtrip.md @@ -1,5 +1,5 @@ | Image | Time (s)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | Memory (GB)
zarrs
rust |
tensorstore
python |
zarr
python |
zarrs
python |
zarr
dask
python |
zarrs
dask
python | |:-----------------------------------|----------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:|-------------------------------:|----------------------------:|---------------------:|----------------------:|-----------------------------:|------------------------------:| -| data/benchmark.zarr | 7.15 | 24.29 | 30.02 | 9.22 | 19.22 | 6.97 | 0.53 | 0.61 | 9.02 | 8.98 | 1.17 | 1.17 | -| data/benchmark_compress.zarr | 1.99 | 19.77 | 25.58 | 5.11 | 19.22 | 5.14 | 0.67 | 1.10 | 9.00 | 9.16 | 1.21 | 1.22 | -| data/benchmark_compress_shard.zarr | 4.43 | 9.06 | 230.85 | 10.89 | 65.35 | 4.03 | 0.21 | 2.27 | 8.97 | 8.71 | 1.75 | 1.18 | \ No newline at end of file +| data/benchmark.zarr | 2.27 | 9.70 | 18.47 | 5.01 | 11.36 | 3.88 | 0.79 | 0.88 | 9.03 | 9.26 | 1.53 | 1.78 | +| data/benchmark_compress.zarr | 1.30 | 6.76 | 15.34 | 4.09 | 10.63 | 3.54 | 1.06 | 1.16 | 9.01 | 9.52 | 1.76 | 1.59 | +| data/benchmark_compress_shard.zarr | 2.84 | 3.75 | 180.90 | 6.62 | 45.65 | 3.33 | 0.22 | 1.54 | 9.02 | 8.72 | 2.68 | 1.57 | \ No newline at end of file From 2eb2ba27b6cf580d70c9e684c6a8ed08b2450feb Mon Sep 17 00:00:00 2001 From: Lachlan Deakin Date: Thu, 17 Apr 2025 16:56:22 +1000 Subject: [PATCH 7/7] chore: add updated plots --- plots/benchmark_read_all.pdf | Bin 95874 -> 95835 bytes plots/benchmark_read_all.svg | 703 ++++++++---------- plots/benchmark_read_all_dask.pdf | Bin 60465 -> 95147 bytes plots/benchmark_read_all_dask.svg | 926 +++++++++++------------ plots/benchmark_read_chunks.pdf | Bin 158174 -> 158185 bytes plots/benchmark_read_chunks.svg | 650 ++++++++-------- plots/benchmark_read_chunks_dask.pdf | Bin 126677 -> 126681 bytes plots/benchmark_read_chunks_dask.svg | 449 ++++++----- plots/benchmark_roundtrip.pdf | Bin 95833 -> 95793 bytes plots/benchmark_roundtrip.svg | 1031 ++++++++++++-------------- plots/benchmark_roundtrip_dask.pdf | Bin 94961 -> 94937 bytes plots/benchmark_roundtrip_dask.svg | 595 +++++++-------- 12 files changed, 2075 insertions(+), 2279 deletions(-) diff --git a/plots/benchmark_read_all.pdf b/plots/benchmark_read_all.pdf index 6acea166b470546afcc2c42f225fea31f5a0f538..baec47fedf18e55068dc588d126ae7f6066cbc32 100644 GIT binary patch delta 3506 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 diff --git a/plots/benchmark_read_all.svg b/plots/benchmark_read_all.svg index ac198fb..4bd6b29 100644 --- a/plots/benchmark_read_all.svg +++ b/plots/benchmark_read_all.svg @@ -34,109 +34,109 @@ z +" clip-path="url(#p09428c31a6)" style="fill: #1f77b4"/> +" clip-path="url(#p09428c31a6)" style="fill: #1f77b4"/> +" clip-path="url(#p09428c31a6)" style="fill: #1f77b4"/> +" clip-path="url(#p09428c31a6)" style="fill: #ff7f0e"/> +" clip-path="url(#p09428c31a6)" style="fill: #ff7f0e"/> +" clip-path="url(#p09428c31a6)" style="fill: #ff7f0e"/> +" clip-path="url(#p09428c31a6)" style="fill: #2ca02c"/> +" clip-path="url(#p09428c31a6)" style="fill: #2ca02c"/> +" clip-path="url(#p09428c31a6)" style="fill: #2ca02c"/> +" clip-path="url(#p09428c31a6)" style="fill: #d62728"/> +" clip-path="url(#p09428c31a6)" style="fill: #d62728"/> +" clip-path="url(#p09428c31a6)" style="fill: #d62728"/> - - + @@ -326,7 +326,7 @@ z - + @@ -363,7 +363,7 @@ z - + @@ -478,16 +478,16 @@ z +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -533,11 +533,11 @@ z +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -583,11 +583,11 @@ z +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -623,11 +623,11 @@ z +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -643,11 +643,11 @@ L 322.143704 195.54674 +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -687,11 +687,11 @@ z +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -707,11 +707,11 @@ L 322.143704 153.308095 +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -757,11 +757,11 @@ z +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -777,11 +777,11 @@ L 322.143704 111.06945 +" clip-path="url(#p09428c31a6)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -929,8 +929,8 @@ L 322.143704 258.904707 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + + - - + - - + + - - + - - + + - + - - + + - - + - - + + - - - + + - - + + - + - - + + - - + - - + + - - + + - + - + - - - + + + - + - - + + + + + - + - - + + - + @@ -1259,26 +1241,26 @@ z +" clip-path="url(#p39035273c5)" style="fill: #1f77b4"/> +" clip-path="url(#p39035273c5)" style="fill: #1f77b4"/> +" clip-path="url(#p39035273c5)" style="fill: #1f77b4"/> +" clip-path="url(#p39035273c5)" style="fill: #ff7f0e"/> +" clip-path="url(#p39035273c5)" style="fill: #ff7f0e"/> +" clip-path="url(#p39035273c5)" style="fill: #ff7f0e"/> +" clip-path="url(#p39035273c5)" style="fill: #2ca02c"/> +" clip-path="url(#p39035273c5)" style="fill: #2ca02c"/> +" clip-path="url(#p39035273c5)" style="fill: #2ca02c"/> +" clip-path="url(#p39035273c5)" style="fill: #d62728"/> +" clip-path="url(#p39035273c5)" style="fill: #d62728"/> +" clip-path="url(#p39035273c5)" style="fill: #d62728"/> - + @@ -1380,7 +1362,7 @@ z - + @@ -1402,7 +1384,7 @@ z - + @@ -1438,11 +1420,11 @@ z +" clip-path="url(#p39035273c5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -1454,54 +1436,54 @@ L 644.99976 258.904707 - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - + @@ -1795,34 +1758,55 @@ L 359.549015 89.950127 L 644.99976 258.904707 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - - + + + - - + + - + - + - + - + + + + - + @@ -1831,72 +1815,72 @@ L 644.99976 258.904707 - - - + + + - - + + - - - + + + - + - - - + + + - + - + - + - + - + - + - + - - - + + + - + - + - + @@ -1906,19 +1890,19 @@ L 644.99976 258.904707 - - + @@ -1984,16 +1968,16 @@ z - - - - + + + - - @@ -2094,30 +2051,23 @@ z - + - - - - - - - - - + + - - - - + + + @@ -2141,23 +2091,30 @@ z - - + + - - - - + + + + - - - - + + - - - - + + + @@ -2254,13 +2209,11 @@ z - - - - + + - - + + @@ -2289,7 +2242,7 @@ z - + @@ -2314,10 +2267,10 @@ z - + - + diff --git a/plots/benchmark_read_all_dask.pdf b/plots/benchmark_read_all_dask.pdf index d8a1722957e62dbbd6d67d38893f37e276005b55..00d42ddd8aed2887d43a7e19e1894388e04f77bb 100644 GIT binary patch delta 37487 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 - +" clip-path="url(#pb8e3d0cd29)" style="fill: #1f77b4"/> - +" clip-path="url(#pb8e3d0cd29)" style="fill: #1f77b4"/> - +" clip-path="url(#pb8e3d0cd29)" style="fill: #1f77b4"/> - +" clip-path="url(#pb8e3d0cd29)" style="fill: #ff7f0e"/> - +" clip-path="url(#pb8e3d0cd29)" style="fill: #ff7f0e"/> - +" clip-path="url(#pb8e3d0cd29)" style="fill: #ff7f0e"/> - - + - + - + - + - + - + @@ -333,7 +333,7 @@ z - + +L 316.885628 258.904707 +" clip-path="url(#pb8e3d0cd29)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -474,18 +474,18 @@ z - + - + - + - + - + - + - + - + - + @@ -580,18 +580,18 @@ L 320.76 186.054472 - + - + - + - + - + - + @@ -642,18 +642,18 @@ L 320.76 137.487649 - + - + - + - + - + - + @@ -710,18 +710,18 @@ L 320.76 88.920826 - + - + - + - + - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + - - + + - - - - + - - + + + + + - - + + - - + + + + + - - + + - - - + + - - +" clip-path="url(#p8dc42703ab)" style="fill: #1f77b4"/> - +" clip-path="url(#p8dc42703ab)" style="fill: #1f77b4"/> - +" clip-path="url(#p8dc42703ab)" style="fill: #1f77b4"/> - +" clip-path="url(#p8dc42703ab)" style="fill: #ff7f0e"/> - +" clip-path="url(#p8dc42703ab)" style="fill: #ff7f0e"/> - +" clip-path="url(#p8dc42703ab)" style="fill: #ff7f0e"/> - + - + @@ -1160,12 +1129,12 @@ z - + - + @@ -1182,12 +1151,12 @@ z - + - + @@ -1200,7 +1169,7 @@ z - + @@ -1216,228 +1185,201 @@ z - +" clip-path="url(#p8dc42703ab)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + - - + + + + + + + - + - + - - + + + + - + - + - - - + + + + + - + - + - - + + - - + + + - + - + - - - - - - + + + + + + - + - + - - + + - + + + - + - + - - + + - + + + - + - + - - + + - + + + - - - - - - - - - - - - - - - - - - + - + - - - - - + + + - + + + + + + + + + + - + - + - + @@ -1679,37 +1621,26 @@ z - - - - - - - - - + + - + - - - + + + - - - - - + + + - - - + @@ -1727,9 +1658,9 @@ Q 108.006381 32.92528 110.006381 32.92528 z " style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/> - - - + + + + - @@ -1814,50 +1745,47 @@ z - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1868,7 +1796,7 @@ L 112.006381 19.43462 z " style="fill: #1f77b4"/> - + @@ -1944,8 +1872,8 @@ L 286.642777 19.43462 z " style="fill: #ff7f0e"/> - - + + - + - - + + - - + + diff --git a/plots/benchmark_read_chunks.pdf b/plots/benchmark_read_chunks.pdf index 073fa0c873d13a7930b4a81ffc2320904056e7c6..dcba4486ac43e61349cc05366e226f9203304ae9 100644 GIT binary patch delta 4311 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 - - + @@ -69,7 +69,7 @@ z - + @@ -104,7 +104,7 @@ z - + @@ -138,7 +138,7 @@ z - + @@ -176,7 +176,7 @@ z - + @@ -214,7 +214,7 @@ z - + @@ -442,16 +442,16 @@ z +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -497,11 +497,11 @@ z +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -547,11 +547,11 @@ z +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -587,11 +587,11 @@ z +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -607,11 +607,11 @@ L 312.063418 186.69199 +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -651,11 +651,11 @@ z +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -671,11 +671,11 @@ L 312.063418 140.294379 +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -721,11 +721,11 @@ z +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -741,11 +741,11 @@ L 312.063418 93.896768 +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -948,106 +948,106 @@ z - + - + - + - + - +L 256.989326 221.954174 +L 312.063418 219.634294 +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5"/> - + - + - +L 312.063418 166.277041 +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #d62728; stroke-width: 1.5"/> - +L 256.989326 204.323082 +L 312.063418 202.003202 +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> +L 91.767051 152.821734 +L 146.841142 167.204993 +L 201.915234 173.236683 +L 256.989326 176.020539 +L 312.063418 176.484516 +" clip-path="url(#pbe575d23a5)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> - + - + - + @@ -1086,7 +1086,7 @@ z - + @@ -1099,7 +1099,7 @@ z - + @@ -1112,7 +1112,7 @@ z - + @@ -1125,7 +1125,7 @@ z - + @@ -1139,7 +1139,7 @@ z - + @@ -1175,18 +1175,18 @@ z - + - + - + - + - + - + @@ -1227,198 +1227,198 @@ L 640.018425 115.450214 - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1562,111 +1562,111 @@ z +L 419.722058 222.978531 +L 474.79615 198.47605 +L 529.870241 172.250552 +L 584.944333 142.891165 +L 640.018425 125.669604 +" clip-path="url(#p26124a4ba1)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5"/> - + - + - + - + - + - + - + - + - + - +" clip-path="url(#p26124a4ba1)" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/> - + - + - + - - @@ -1894,17 +1890,10 @@ z - + - - - - - - - - - + + @@ -1914,7 +1903,7 @@ L 24 36.790297 " style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> - + - - + + - - - + + + - - - - + + - - - + + @@ -2062,13 +2056,11 @@ L 196.491804 43.487404 - - - - + + - - + + - + @@ -2284,10 +2276,10 @@ z - + - + diff --git a/plots/benchmark_read_chunks_dask.pdf b/plots/benchmark_read_chunks_dask.pdf index 176199b83b6baaec121c1455a6e6e3620c890288..09c57e371c6bc583adf935334f66a2e6e2a92696 100644 GIT binary patch delta 3353 zcmZXQc{tQ-8^;ZU(}c2b$=Hd^@*6Y8nr#drQP!xj6hp?o#%PdzjVMx%r7%j?3L#<8 zP%3K((UI*4Goci6!#@36uy&}ds?M?hhN)v)ETNEG>dbWSgjbFnCVBAgdhGtZ+d)O||c#Abdz ze*l)By0HGxYC@EBYkrm(FlxOAddRHt)&H>FSk4f3U6)L*uI`b@WS)(*pPq+}x1C4P zTNZcjJl^IDYbBB;E+_CF^Y_v?VEV$qoy}5>=GZG9l6N`}`TS%}Zpz1)B+C0_8=uqb z2wjV_;T9qkInTlsf+p-OE;NWex*e@_kG=tW%f(Nv!}TBbjr#iFHBPzm474l9DeyVx zagLL6E>V%wI;EwIEu+m%@9T=MzzPkAGS10_-(6E5hWbE?X`od+}GzLWi zfiG*6lFAPqu3GDHcd{;R2CjdGaL`Hy<+!^2Vy__>uSk8SvTuqcp&y zo?kJ1V8l!}0XuH9ldJNHORtNDhd_L3;PME=hPBbC$v-=r;&@%_Jm*G|?%tMp*!VUe zwt2N)6hj_O9cpeKSl%mTJQ;EFs%b^?2^1e!*E>&c)h7O&EPj?@_`^5KK3hFZwp9Mx zbOfO_6yyVrSMieJa7t`2?eLC0y#+!cox zQWbykiiVTCoL>(XL{fnYalE!_?2+0xbz^NYCngoW!7B0Awz0Rfo9A5W7+LvLz*;F8 zOLh(vaH^XER=Cmr=CiH^H+Q%6P`f7M|lGw=GcCDR6mm{A<#hWQxx zm(a0;BOnGPgl`3pEvZ(3nN@{eu&UiSS!EL3rO0oW8+b-PZXo-@J{G%{bM-$J+KUKbEcr#~J?L74 zJ-p%mS$b&gho(eIy^>?J08i~qMOcD2a4mloYnLJPXxr{8INFyvPxhackIMXdCV|16 zu#o67l-aVT-ZdQml4U2xXYmM5(-OFE#c7xO=JTZ~_Al{v3GP?e z;oM-v3{lD=IWdt*#?B)q-pqGW1ferN$8XFUkJR5h(IYz}Cufwv)3KFtdqh~XgQG9S zqC}fp>E5NkjQiy0uP`$Pb=(Q}Q)*@&AK-?t<2=q@Ry)#l&)r)UpC$}m|MHXq)+3&# z_4S5I-8y>}5%oAHx7rFT7IIeXO=OmpAMPxVxJk326DN6zceBA!2<%D`8qmrmFi zFb8kG)$GexXfiBuYTDc4?ByrDm0; zA)R!mw@sVKG8DsP=ajWdKwkUtwVnqhY@=@xrtda;A1G2O%pJpD3bfpu;1P+CRQuVD zV*Mz&hCjs&Ambbn*L+2@@Uo-Og;4L^Q@4T%ODzL9Wf2?grMLs3pNke=SLj#y&K@W+ zeNK4KM1LQB-4rB#+0yTIl(K5%OxlKk6V{#`n?*MD?3S<2ko2;Qp;9|04yImlK~Syb zgxv4t?KmURlOAk^t_|MVFJ&q?d?n9)bjeIO&U3ZOL=i_l-o#Z}LHyV*ZKnvT_b;J@ zKrhu!2#geI^mOrKJ0q35i#q27hCkapy4vdUs7S+>dO^3yP1)l}{G(&SlC(+T0Y{)4 zGD7ZB!Qm-ly9zh^yScxHzJn}UH0SKb_GgQLb_@CP0y(~e76KQ~J)y9eih_~=2MP|d^c=@NWzTVq@!R+FZgJ-h z+zeWPEOx1g?s=M%OI}bJSJR%kJfUE1A9(294g5P=XlTS9q)@7V_uOESsy$r4Aec#a zs!50D3?m_Xx$F+IFXa2IJf|iKjDJRgQSm|3$IwR|pVu#p_Xg-iH?}?%pNiNUJ#9O) zv%9wP-J_8C&g}Ch`qa(Lxc1!%JwhqQ`H-4)18VvPCy98Oj9)L6=Iy?J=}dtbrl*@~ zm8N~WmpfpoP9Vd=cM=fm&j7`AWt1~ae)^q<(pSZJX<1NQ14;pD2U(?Bih0n=R06b! z^z3Y*$(AB0t>iQgPStHp4)QACOj71zg6Os(F+o{r9nt-j0`jK!-BrpUk!&gsvyCPM zyQ^g%X30JEhlKII329#bm-Ve`w@z%6*p?>gN^HiWcfP67m3ld42-LrZ?7A)_o2~ z(v(v8NYhMQaO2CPf3OvLX19KzfYh8bmJRn$As_qp{CWDLDxUU@PIijfl0fPQPCMhO z3H)LAw2fthDzQ?xW_cfJo%gvh4S+WBrYk&G4XpmK>sGRD5{sFG$t0p9=~*KIum*{!mNry@M8ww}jr|Qx{F2(6NPS zkw=sAk4nH92&a1Kh&fnc2-^KtP< z(Go(-mbZdqLYW(yKW>>{zTl?zfg90TssG)(NcQ`>Z;{!Qp8ok5#|M6Tgm^9KmNsp! zlfcDYl*Ffpd#Q!Xl`3wb&le9kpjOsXUC40K!S}~~?iBY7soSR?gAw|X5jK~)4#EB~ zyqi+Yei1C(7~_wA@O)sQrGBV7Idr{m{QI0+#E-d)JTtq28_NqyR72k7&tD?33BA-T zlRpyeoTcte(q8{9`0=a}AxG!XZHLt|gE40#=d7q-8U^a_!CmdwbR-8e8Fn+Zb0ai*l{ELClG9CZD{QVv(WZx zqjb7z#<7?e63vA&MDA)S3%ND-(3GRid)|>>iW@(*PRaj0nTL4R)!j>CD^I^RhtIfq zCaiYr;c_?q-Ixa{KWwS9f_`%tM?Z#`exML2p;X>fG8}j}-)V7c{SC5Mygb{Q?0W6T zjxV=VVy#0}_eQdC`8=Pa+R+x3NQ?H0rP5c;Q;;~v%vkaUR^VWs&|bk3XL0Fp#ypU7 z66_%4h}Uh|AWLvlF`|Om44r(Y^ClV5+8Gb=^z#S`4)i2k{`Dfc5g`a96b}9MKw>m7 z|3Ekk#s%;+2k?O6XA}@{b%Y88X2jA3dz1W(3BjIFWn(QQ9H{|EAutHEh6YMAUwj2* z<*5OM|2j}VDCF0TKx$~9e`jcb)!^6pzd8(tHOYR41%6|i2vq*d6_7Rv$p2#%q)0~Z zlfmHt624Cc2QX+>vwzvM>M$t8Zw!mU>|+211MK%>?Tq@bANijh;D9C)t+`*UiNfwT z#2|j(6^=w>_iHgo0FK?~he2up|MGKSg$ze(BKH-tf=2=Sl0m=$V1HUHrh(m;0!yoj W)yR)u1K|#`VuM2z6iiOxApZdpRnqJL delta 3311 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 O5HO~zSGDdSnf?PM-|6`P diff --git a/plots/benchmark_read_chunks_dask.svg b/plots/benchmark_read_chunks_dask.svg index 4b44a72..57dced7 100644 --- a/plots/benchmark_read_chunks_dask.svg +++ b/plots/benchmark_read_chunks_dask.svg @@ -35,12 +35,12 @@ z - - + @@ -69,7 +69,7 @@ z - + @@ -104,7 +104,7 @@ z - + @@ -138,7 +138,7 @@ z - + @@ -176,7 +176,7 @@ z - + @@ -214,7 +214,7 @@ z - + @@ -442,16 +442,16 @@ z +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -497,11 +497,11 @@ z +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -547,11 +547,11 @@ z +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -587,11 +587,11 @@ z +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -607,11 +607,11 @@ L 315.17675 183.879046 +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -651,11 +651,11 @@ z +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -671,11 +671,11 @@ L 315.17675 135.606139 +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -721,11 +721,11 @@ z +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -741,11 +741,11 @@ L 315.17675 87.333232 +" clip-path="url(#p3b528ea966)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -948,52 +948,52 @@ z - + - + - + - + - + - + - + @@ -1032,7 +1032,7 @@ z - + @@ -1045,7 +1045,7 @@ z - + @@ -1058,7 +1058,7 @@ z - + @@ -1071,7 +1071,7 @@ z - + @@ -1085,7 +1085,7 @@ z - + @@ -1121,18 +1121,18 @@ z - + - + - + @@ -1141,138 +1141,138 @@ L 640.018425 137.819252 - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1416,57 +1416,57 @@ z +L 417.231392 228.529115 +L 472.92815 202.564112 +L 528.624908 174.15649 +L 584.321667 143.014642 +L 640.018425 103.779615 +" clip-path="url(#p5565aa6c1c)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5"/> - + - + - + - +" clip-path="url(#p5565aa6c1c)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> - + - - + + + - @@ -1626,50 +1624,47 @@ z - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1753,7 +1748,7 @@ L 198.636396 22.93462 " style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> - + - + @@ -1970,10 +1965,10 @@ z - + - + diff --git a/plots/benchmark_roundtrip.pdf b/plots/benchmark_roundtrip.pdf index ab8d13d733a939f0aea9afb2b873659ff0536960..16f12c96e906f7c9589e4dc840127b501b921aa4 100644 GIT binary patch delta 3500 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 C&1zl% delta 3517 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 - +" clip-path="url(#p9ef87c5af2)" style="fill: #1f77b4"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #1f77b4"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #1f77b4"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #ff7f0e"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #ff7f0e"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #ff7f0e"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #2ca02c"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #2ca02c"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #2ca02c"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #d62728"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #d62728"/> - +" clip-path="url(#p9ef87c5af2)" style="fill: #d62728"/> - - + - + - + - + - + - + @@ -381,7 +381,7 @@ z - + +L 327.125039 258.904707 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -532,12 +532,12 @@ z +L 327.125039 237.439458 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -604,12 +604,12 @@ z +L 327.125039 215.97421 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -624,12 +624,12 @@ L 324.634372 215.97421 +L 327.125039 194.508961 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -665,12 +665,12 @@ z +L 327.125039 173.043713 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -706,12 +706,12 @@ z +L 327.125039 151.578464 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -727,12 +727,12 @@ L 324.634372 151.578464 +L 327.125039 130.113216 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -748,12 +748,12 @@ L 324.634372 130.113216 +L 327.125039 108.647967 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -769,12 +769,12 @@ L 324.634372 108.647967 +L 327.125039 87.182719 +" clip-path="url(#p9ef87c5af2)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -891,12 +891,12 @@ L 41.674294 87.182719 - - + + - - + + - + + @@ -976,54 +989,8 @@ z - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - - + + - + - + - - + + - - + + - - - + + + + + + - - + + - - + + - + + - - - + + + - - + + - - +" clip-path="url(#p069d844f33)" style="fill: #1f77b4"/> - +" clip-path="url(#p069d844f33)" style="fill: #1f77b4"/> - +" clip-path="url(#p069d844f33)" style="fill: #1f77b4"/> - +" clip-path="url(#p069d844f33)" style="fill: #ff7f0e"/> - +" clip-path="url(#p069d844f33)" style="fill: #ff7f0e"/> - +" clip-path="url(#p069d844f33)" style="fill: #ff7f0e"/> - +" clip-path="url(#p069d844f33)" style="fill: #2ca02c"/> - +" clip-path="url(#p069d844f33)" style="fill: #2ca02c"/> - +" clip-path="url(#p069d844f33)" style="fill: #2ca02c"/> - +" clip-path="url(#p069d844f33)" style="fill: #d62728"/> - +" clip-path="url(#p069d844f33)" style="fill: #d62728"/> - +" clip-path="url(#p069d844f33)" style="fill: #d62728"/> - + - + @@ -1280,12 +1345,12 @@ z - + - + @@ -1302,12 +1367,12 @@ z - + - + @@ -1320,7 +1385,7 @@ z - + @@ -1336,54 +1401,54 @@ z - +" clip-path="url(#p069d844f33)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - + - + - - - + - - - - + @@ -1736,167 +1760,123 @@ z - - - - - - + + + - + - - - + + + - + - - - + + + - - + + - - - - - - + + + - - + + - - - - + + + + - - + + - + - + - - - + + + - - + + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - - + + - - + @@ -1962,16 +1942,16 @@ z - - - - + + + - - @@ -2072,30 +2025,23 @@ z - + - - - - - - - - - + + - - - - + + + @@ -2119,23 +2065,30 @@ z - - + + - - - - + + + + - - - - + + - - - - + + + @@ -2232,13 +2183,11 @@ z - - - - + + - - + + @@ -2267,7 +2216,7 @@ z - + @@ -2292,11 +2241,11 @@ z - - + + - - + + diff --git a/plots/benchmark_roundtrip_dask.pdf b/plots/benchmark_roundtrip_dask.pdf index f7f2381d2b7bd49c6cd34db39573ce69984777f6..aff3b9d26e04cfbec6a9c752af81f8118c66ee31 100644 GIT binary patch delta 2628 zcmZXQc|6pM8pfMJ%%HLibqpeeD`w1$nK_CWTO8}yWn`N|b`E0vNSzt`9#>Nd9WmBq zCnO`u)*x$%aY%L@`*P1c_m6w8-oM_@_kG{z^FGhoEZ68PR|ORW82L`<3BKB}S(TSE zV=#&(hw61rq|X<+mEMS+T+~Wo*3eVgnQ-n=rxvHc=gwHFYkF!T-x<&hvcv zwU%)jYr_EOPpVZ&YK84XL#~7+hX_(_4JE#BmsIBn`+dDpgnTxkr#0!?S08!T{83SrU5;1SsF(;E=RWt7&s!U7Um%jtwUE+9C z>FbWNA4O~A7--ADW(=7QVtyfATTyy&8;b(Ypj@*&ae$>+O?{^pruLJLcBx-n8>g?3 zQAa39|D+@I9Nd6!D!Qu2BvBTkW_3GICjWtaK*z6;bnNSXZ}N)*i|HqcI}iMVxNQa1 z-ohPL(w+&IkdulIM*4aRcC_n<#d<%`ssp%3@bqzW!_3O8`L+t2M^S%4hj-pc@i6;@ zI+8S10aV+G{yoUNfehowPnz}=;U1}kc#4~Qx63xUuYVW&BoiGWAtR7)aKQj_Zq!wu zEAG;hP2b*>*ht@A(QTC-w;N5QM@F&sq4hfYiZ0Iz4~P82rTsVrtl>=N z=KSo#?#Y9)?n#aKZ>>sV*|N2o8Dx*wOik(A^G&5jPjz9xY^<}GE!6W7za|XdVFQj@ z>CxV8T^+>2qo|2!!#1D6P`Bjq_*!nMhLi-k03VqK5J|BiZpu0c)|?!dqb0WDJ^BjgTW*=FGLS-=)@8w| zC>4<#x&dcy==#T=2%PPtWw{8*s{^2SAPAyTtEL|<@_!pvi7)t*E}%ldLDUPadEU*F z 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 OkAMoOsGPPl7x){B=*hhR diff --git a/plots/benchmark_roundtrip_dask.svg b/plots/benchmark_roundtrip_dask.svg index a8faf66..bba3746 100644 --- a/plots/benchmark_roundtrip_dask.svg +++ b/plots/benchmark_roundtrip_dask.svg @@ -34,61 +34,61 @@ z +" clip-path="url(#pd8f35cf91b)" style="fill: #1f77b4"/> +" clip-path="url(#pd8f35cf91b)" style="fill: #1f77b4"/> +" clip-path="url(#pd8f35cf91b)" style="fill: #1f77b4"/> +" clip-path="url(#pd8f35cf91b)" style="fill: #ff7f0e"/> +" clip-path="url(#pd8f35cf91b)" style="fill: #ff7f0e"/> +" clip-path="url(#pd8f35cf91b)" style="fill: #ff7f0e"/> - - + @@ -278,7 +278,7 @@ z - + @@ -315,7 +315,7 @@ z - + @@ -430,16 +430,16 @@ z +" clip-path="url(#pd8f35cf91b)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -476,11 +476,11 @@ z +" clip-path="url(#pd8f35cf91b)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -515,11 +515,11 @@ z +" clip-path="url(#pd8f35cf91b)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -558,11 +558,11 @@ z +" clip-path="url(#pd8f35cf91b)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -607,11 +607,11 @@ z +" clip-path="url(#pd8f35cf91b)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -654,11 +654,11 @@ z +" clip-path="url(#pd8f35cf91b)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -807,8 +807,8 @@ L 319.376296 258.904707 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + + - - + - - + + - - - - - - - - - - - - - - + + - - - + + + - - - - + + + - - - + + + - + + + + + + + + + - + - - + + - - + + @@ -1038,18 +1024,18 @@ z +" clip-path="url(#p45fd2aa662)" style="fill: #1f77b4"/> +" clip-path="url(#p45fd2aa662)" style="fill: #1f77b4"/> +" clip-path="url(#p45fd2aa662)" style="fill: #1f77b4"/> +" clip-path="url(#p45fd2aa662)" style="fill: #ff7f0e"/> +" clip-path="url(#p45fd2aa662)" style="fill: #ff7f0e"/> +" clip-path="url(#p45fd2aa662)" style="fill: #ff7f0e"/> - + @@ -1111,7 +1097,7 @@ z - + @@ -1133,7 +1119,7 @@ z - + @@ -1169,11 +1155,11 @@ z +" clip-path="url(#p45fd2aa662)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -1196,18 +1182,18 @@ z - + - + - + @@ -1216,18 +1202,18 @@ L 644.99976 222.161284 - + - + - + @@ -1236,18 +1222,18 @@ L 644.99976 185.417861 - + - + - + @@ -1256,18 +1242,18 @@ L 644.99976 148.674437 - + - + - + @@ -1276,18 +1262,18 @@ L 644.99976 111.931014 - + - + - + @@ -1473,82 +1459,118 @@ L 644.99976 258.904707 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + + - - + + - - + + + + + - - + + - + + + + - + - - + + - - + + - - + + - - + - - + + - + @@ -1567,8 +1589,8 @@ z " style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/> - - + + - - @@ -1673,50 +1655,47 @@ z - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1804,7 +1783,7 @@ z " style="fill: #ff7f0e"/> - + - + - + - +