Dask массив к zarr с неизвестными формами
Я пытаюсь сохранить массив dask в файле zarr.
Мне удалось сделать это, когда массив dask имеет определенную форму.
import dask
import dask.array as da
import numpy as np
from tempfile import TemporaryDirectory
import zarr
np_array = np.random.randint(1, 10, size=1000)
array = da.from_array(np_array)
with TemporaryDirectory() as tmpdir:
delayed = da.to_zarr(array, url=tmpdir,
compute=False, component='/data')
dask.compute(delayed)
z_object = zarr.open_group(tmpdir, mode='r')
assert np.all(np_array == z_object.data[:])
Однако, если я выполнил какую-либо операцию с массивом dask, фигура теряется, и zarr жалуется на Nans в фигуре.
# this will fail
np_array = np.random.randint(1, 10, size=1000)
array = da.from_array(np_array)
array = array[array > 5]
with TemporaryDirectory() as tmpdir:
delayed = da.to_zarr(array, url=tmpdir,
compute=False, component='/data')
dask.compute(delayed)
z_object = zarr.open_group(tmpdir, mode='r')
assert np.all(np_array[np_array > 5] == z_object.data[:])
Это повышенная ошибка:
Traceback (most recent call last):
File "/home/peio/devel/variation/variation6/variation6/tests/test_zarr.py", line 38, in <module>
without_shape()
File "/home/peio/devel/variation/variation6/variation6/tests/test_zarr.py", line 29, in without_shape
compute=False, component='/data')
File "/home/peio/devel/variation/pyenv3/lib/python3.7/site-packages/dask/array/core.py", line 2808, in to_zarr
**kwargs
File "/home/peio/devel/variation/pyenv3/lib/python3.7/site-packages/zarr/creation.py", line 120, in create
chunk_store=chunk_store, filters=filters, object_codec=object_codec)
File "/home/peio/devel/variation/pyenv3/lib/python3.7/site-packages/zarr/storage.py", line 323, in init_array
object_codec=object_codec)
File "/home/peio/devel/variation/pyenv3/lib/python3.7/site-packages/zarr/storage.py", line 343, in _init_array_metadata
shape = normalize_shape(shape) + dtype.shape
File "/home/peio/devel/variation/pyenv3/lib/python3.7/site-packages/zarr/util.py", line 58, in normalize_shape
shape = tuple(int(s) for s in shape)
File "/home/peio/devel/variation/pyenv3/lib/python3.7/site-packages/zarr/util.py", line 58, in <genexpr>
shape = tuple(int(s) for s in shape)
ValueError: cannot convert float NaN to integer
Есть ли способ сохранить массив dask без известной формы в файле zarr?
Заранее спасибо!
1 ответ
Зарр ожидает, что формы куска одинаковы и известны заранее. В настоящее время Dask облегчает это, перераспределяя массив как однородный. тем не мение array[array > 5]
создает Dask Array с неизвестными формами фрагментов. Таким образом, нет никакого способа изменить его заранее, чтобы быть единообразным заранее, поскольку необходимой информации нет. Тем не менее, мы могли бы объяснить это лучше.
Можно обойти это, используя операции Dask, которые возвращают известные формы фрагментов (как предлагает Дэвид). В качестве альтернативы можно определить формы блоков перед сохранением ( за счет вычислений). Мы могли бы также обсудить расширение Zarr для решения этого случая, но это более долгосрочное решение.