Skip to content

Commit b7144aa

Browse files
committed
migrate compression metadata
1 parent 1718063 commit b7144aa

File tree

3 files changed

+52
-15
lines changed

3 files changed

+52
-15
lines changed

zarr/core.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -729,11 +729,10 @@ def __repr__(self):
729729

730730
# storage size info
731731
r += '\n nbytes: %s' % human_readable_size(self.nbytes)
732-
if self.compression:
733-
if self.nbytes_stored > 0:
734-
r += '; nbytes_stored: %s' % human_readable_size(
735-
self.nbytes_stored)
736-
r += '; ratio: %.1f' % (self.nbytes / self.nbytes_stored)
732+
if self.nbytes_stored > 0:
733+
r += '; nbytes_stored: %s' % human_readable_size(
734+
self.nbytes_stored)
735+
r += '; ratio: %.1f' % (self.nbytes / self.nbytes_stored)
737736
n_chunks = reduce(operator.mul, self.cdata_shape)
738737
r += '; initialized: %s/%s' % (self.initialized, n_chunks)
739738

zarr/storage.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -792,10 +792,27 @@ def migrate_1to2(store):
792792
from zarr import meta_v1
793793
meta = meta_v1.decode_metadata(store['meta'])
794794
del store['meta']
795+
796+
# add empty filters
795797
meta['filters'] = None
796-
if meta['compression'] and meta['compression'].lower() == 'none':
797-
meta['compression'] = None
798-
meta['compression_opts'] = None
798+
799+
# migration compression metadata
800+
compression = meta['compression']
801+
if compression is None or compression == 'none':
802+
compressor_config = None
803+
else:
804+
compression_opts = meta['compression_opts']
805+
codec_cls = codec_registry[compression]
806+
if isinstance(compression_opts, dict):
807+
compressor = codec_cls(**compression_opts)
808+
else:
809+
compressor = codec_cls(compression_opts)
810+
compressor_config = compressor.get_config()
811+
meta['compressor'] = compressor_config
812+
del meta['compression']
813+
del meta['compression_opts']
814+
815+
# store migrated metadata
799816
store[array_meta_key] = encode_array_metadata(meta)
800817

801818
# migrate user attributes

zarr/tests/test_storage.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
ZARR_FORMAT, decode_group_metadata, encode_group_metadata
2121
from zarr.compat import text_type
2222
from zarr.storage import default_compressor
23-
from zarr.codecs import Zlib
23+
from zarr.codecs import Zlib, Blosc
2424

2525

2626
class StoreTests(object):
@@ -670,18 +670,38 @@ def test_migrate_1to2():
670670

671671
# check results
672672
assert 'meta' not in store
673-
assert '.zarray' in store
673+
assert array_meta_key in store
674674
assert 'attrs' not in store
675-
assert '.zattrs' in store
675+
assert attrs_key in store
676676
meta_migrated = decode_array_metadata(store[array_meta_key])
677677
eq(2, meta_migrated['zarr_format'])
678+
678679
# preserved fields
679-
for f in 'shape', 'chunks', 'dtype', 'compression', 'compression_opts', \
680-
'fill_value', 'order':
680+
for f in 'shape', 'chunks', 'dtype', 'fill_value', 'order':
681681
eq(meta[f], meta_migrated[f])
682+
682683
# migrate should have added empty filters field
683684
assert_is_none(meta_migrated['filters'])
684685

686+
# check compression and compression_opts migrated to compressor
687+
assert 'compression' not in meta_migrated
688+
assert 'compression_opts' not in meta_migrated
689+
eq(meta_migrated['compressor'], Zlib(1).get_config())
690+
691+
# check dict compression_opts
692+
store = dict()
693+
meta['compression'] = 'blosc'
694+
meta['compression_opts'] = dict(cname='lz4', clevel=5, shuffle=1)
695+
meta_json = meta_v1.encode_metadata(meta)
696+
store['meta'] = meta_json
697+
store['attrs'] = json.dumps(dict()).encode('ascii')
698+
migrate_1to2(store)
699+
meta_migrated = decode_array_metadata(store[array_meta_key])
700+
assert 'compression' not in meta_migrated
701+
assert 'compression_opts' not in meta_migrated
702+
eq(meta_migrated['compressor'],
703+
Blosc(cname='lz4', clevel=5, shuffle=1).get_config())
704+
685705
# check 'none' compression is migrated to None (null in JSON)
686706
store = dict()
687707
meta['compression'] = 'none'
@@ -690,5 +710,6 @@ def test_migrate_1to2():
690710
store['attrs'] = json.dumps(dict()).encode('ascii')
691711
migrate_1to2(store)
692712
meta_migrated = decode_array_metadata(store[array_meta_key])
693-
assert_is_none(meta_migrated['compression'])
694-
assert_is_none(meta_migrated['compression_opts'])
713+
assert 'compression' not in meta_migrated
714+
assert 'compression_opts' not in meta_migrated
715+
assert_is_none(meta_migrated['compressor'])

0 commit comments

Comments
 (0)