python - zarr consolidate_metadata 出现 TypeError 错误:memoryview:需要一个类似字节的对象,而不是“数组”
问题描述
我正在尝试整合现有 zarr 商店的元数据,但如果我创建新的 zarr 商店并调用zarr.consolidate_metadata(store)
.
代码示例:
import zarr
## create test zarr store
path_to_store = "test.zarr"
store = zarr.open(path_to_store)
store.create_dataset('foo', shape=(10000, 10000), chunks=(1000, 1000), dtype='i4')
## call consolidate_metadata on store
zarr.consolidate_metadata(store)
这将创建一个.zmetadata
目录,而不是文件,其中包含一个 0 块,就像它是一个 zarr 数组。但是调用本身会出错TypeError: memoryview: a bytes-like object is required, not 'Array'
。
我认为它创建这个.zmetadata
数组可能是 zarr 中的一个错误,但是我尝试了不同的 zarr 和 Python 版本,所以我很确定我也做错了,因为这样一个主要错误不会持续很长时间。
完整的错误是:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/var/folders/xf/xwjm3rj52ls9780rvrbbb9tm0000gn/T/ipykernel_84668/2011535042.py in <module>
1 ## call consolidate_metadata on store
----> 2 zarr.consolidate_metadata(store)
/opt/anaconda3/envs/gefs/lib/python3.9/site-packages/zarr/convenience.py in consolidate_metadata(store, metadata_key)
1122 }
1123 store[metadata_key] = json_dumps(out)
-> 1124 return open_consolidated(store, metadata_key=metadata_key)
1125
1126
/opt/anaconda3/envs/gefs/lib/python3.9/site-packages/zarr/convenience.py in open_consolidated(store, metadata_key, mode, **kwargs)
1176
1177 # setup metadata store
-> 1178 meta_store = ConsolidatedMetadataStore(store, metadata_key=metadata_key)
1179
1180 # pass through
/opt/anaconda3/envs/gefs/lib/python3.9/site-packages/zarr/storage.py in __init__(self, store, metadata_key)
2767
2768 # retrieve consolidated metadata
-> 2769 meta = json_loads(store[metadata_key])
2770
2771 # check format of consolidated metadata
/opt/anaconda3/envs/gefs/lib/python3.9/site-packages/zarr/util.py in json_loads(s)
33 def json_loads(s: str) -> Dict[str, Any]:
34 """Read JSON in a consistent way."""
---> 35 return json.loads(ensure_text(s, 'ascii'))
36
37
/opt/anaconda3/envs/gefs/lib/python3.9/site-packages/numcodecs/compat.py in ensure_text(s, encoding)
126 def ensure_text(s, encoding='utf-8'):
127 if not isinstance(s, str):
--> 128 s = ensure_contiguous_ndarray(s)
129 s = codecs.decode(s, encoding)
130 return s
/opt/anaconda3/envs/gefs/lib/python3.9/site-packages/numcodecs/compat.py in ensure_contiguous_ndarray(buf, max_buffer_size)
79
80 # ensure input is a numpy array
---> 81 arr = ensure_ndarray(buf)
82
83 # check for object arrays, these are just memory pointers, actual memory holding
/opt/anaconda3/envs/gefs/lib/python3.9/site-packages/numcodecs/compat.py in ensure_ndarray(buf)
43 # N.B., first take a memoryview to make sure that we subsequently create a
44 # numpy array from a memory buffer with no copy
---> 45 mem = memoryview(buf)
46
47 # instantiate array from memoryview, ensures no copy
TypeError: memoryview: a bytes-like object is required, not 'Array'
解决方案
正确的调用是:
zarr.consolidate_metadata(path_to_store)
只是通过路径,而不是您从开设商店获得的实际 ZarrGroup。这(对我来说)无需手动清理.zmetadata
目录即可工作,因为 consolidate_metadata 无论如何都应该覆盖现有文件。
推荐阅读
- time-complexity - 其中有更高阶的增长,cn(log (base 1.5) n) 或 d.(n^(log (base 1.5) 2))
- python - BeautifulSoup:Python:尝试从多行中提取数据
- kentico - UniversalViewerWithCustomQuery Where 子句使用 QueryString 参数
- javascript - 在移动浏览器中未正确触发 Jquery 点击事件
- time - 如何以亚秒级精度计时操作的持续时间?
- python - 按字母顺序查找最长的子串。我的代码有什么问题
- r - 如何遍历列并创建不同的图?
- python - 熊猫丢弃重复忽略 NaN
- python - Jupyter ModuleError pyaudio
- node.js - 我收到错误“{ 错误:无效登录:535-5.7.8 用户名和密码不被接受。” 当我尝试使用 Node JS 中的模块 nodemailer 发送邮件时