It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.
In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
...: store='a.zarr')
In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
--------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
-->164returnArray(sync(async_api.array(data=data, **kwargs)))
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
138return_result=next(iter(finished)).result()
140ifisinstance(return_result, BaseException):
-->141raisereturn_result142else:
143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
-->100returnawaitcoro101exceptExceptionasex:
102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
526z=awaitcreate(**kwargs)
528# fill with data-->529awaitz.setitem(slice(None), data)
531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
874prototype=default_buffer_prototype()
875indexer=BasicIndexer(
876selection,
877shape=self.metadata.shape,
878chunk_grid=self.metadata.chunk_grid,
879 )
-->880returnawaitself._set_selection(indexer, value, prototype=prototype)
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
854 [
855 (
856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
858chunk_selection,
859out_selection,
860 )
861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
863value_buffer,
864drop_axes=indexer.drop_axes,
865 )
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
450asyncdefwrite(
451self,
452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
453value: NDBuffer,
454drop_axes: tuple[int, ...] = (),
455 ) ->None:
-->456awaitconcurrent_map(
457 [
458 (single_batch_info, value, drop_axes)
459forsingle_batch_infoinbatched(batch_info, self.batch_size)
460 ],
461self.write_batch,
462config.get("async.concurrency"),
463 )
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
61asyncwithsem:
62returnawaitfunc(*item)
--->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
60asyncdefrun(item: tuple[Any]) ->V:
61asyncwithsem:
--->62returnawaitfunc(*item)
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
353chunk_bytes_batch=awaitconcurrent_map(
354 [
355 (
(...)
362config.get("async.concurrency"),
363 )
364chunk_array_batch=awaitself.decode_batch(
365 [
366 (chunk_bytes, chunk_spec)
(...)
370 ],
371 )
373chunk_array_batch= [
-->374self._merge_chunk_array(
375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
378chunk_array_batch, batch_info, strict=False379 )
380 ]
382chunk_array_batch= [
383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
(...)
388 )
389 ]
391chunk_bytes_batch=awaitself.encode_batch(
392 [
393 (chunk_array, chunk_spec)
(...)
397 ],
398 )
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
314chunk_value=value315else:
-->316chunk_value=value[out_selection]
317# handle missing singleton dimensions318ifdrop_axes!= ():
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
179def__getitem__(self, key: Any) ->Self:
-->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
1328else:
1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
41extra_args=len(args) -len(all_args)
42ifextra_args<=0:
--->43returnf(*args, **kwargs)
45# extra_args > 046args_msg= [
47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
49 ]
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
1767prototype=default_buffer_prototype()
1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
->1769returnsync(
1770self._async_array._get_selection(
1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
1773 )
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
126loop0=asyncio.events.get_running_loop()
127ifloop0isloop:
-->128raiseSyncError("Calling sync() from within a running loop")
129exceptRuntimeError:
130passSyncError: Callingsync() fromwithinarunningloop
Zarr version
3.0.0.beta
Numcodecs version
0.13
Python Version
3.11
Operating System
Mac
Installation
pip
Description
It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.
Steps to reproduce
Additional output
No response