DEBUG.WIKI
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →
雨云;给项目一台云服务器
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →

h5py 3.16 报 stored datatype size,检查压缩分块元数据

HDF5 2.0.0拒绝不一致的chunk layout,不是数据集名称丢失。核对PureHDF写入版本,修正新文件并保留旧原件,不能把旧读取器可打开当文件有效。

同一份 HDF5 文件,以前能读取,换到 h5py 3.16.0、HDF5 2.0.0 后,打开某个数据集却报:

KeyError: Unable to synchronously open object (stored datatype size in chunk layout does not match datatype description)

另一条相关错误是 stored chunk dimension encoding length does not match value calculated from chunk dimensions。先保留原文件,再核对写入器和数据集布局;旧读取器能打开文件,不足以证明文件元数据符合格式要求。

一组明确条件是 PureHDF 2.1.2 写出的压缩分块数据:X_mm、Z_mm 声明为 float64,每个元素应占8字节,chunk layout 却记录了4字节。HDF5 2.0.0 拒绝这处矛盾,问题不在 Python 字典里真的缺少了数据集名称。

先区分数据类型大小和分块尺寸编码

h5py 把底层对象打开失败表现为 KeyError,不应因此创建同名空数据集来“补键”。记录完整错误、数据集路径、h5py 与实际链接的 HDF5 版本。自行编译的 h5py 与官方 wheel 可能使用不同 HDF5,不能只比较 Python 包版本。

下面的片段仅展示已知文件中的读取位置,文件名和数据集路径需按自己的数据修改:

import h5py

with h5py.File('input.h5', 'r') as file:
    values = file['Profile/X_mm'][:]

[:] 会读取整个数据集,真实数据较大时应按既有内存预算分片读取。文件模式保持只读,不要在唯一原件上尝试改类型、改压缩方式或十六进制补丁。

修正写入器不会自动修好旧文件

PureHDF 2.1.3 修过元素大小,但仍出现分块尺寸编码长度错误;2.1.4 又对相关编码作了修正。这两个错误不能混成“装任意2.1.3以上版本就能读取所有历史文件”。正式2.1.4可作为已核对的写端修正边界,实际应用仍应检查后续兼容版本与生成文件。

能够从原始业务数据重新导出的,先保留旧文件及其校验值,使用确认过的写入器生成到新路径。在目标 h5py/HDF5 环境中逐个打开受影响数据集,比较 dtype、shape、数值、必要属性、单位与坐标,再切换下游入口。只成功打开根组或看见数据集名称,不代表全部压缩数据已经读出。

无法重新生成的历史文件,应作为受损元数据资料单独处理。旧读取器可用于隔离环境下的只读提取与对照,但不应据此取消新读取器的校验,也不能认定提取到的每个值都正确。需要迁移时写入新文件并保留完整验证记录;没有校验条件就保留限制,不覆盖原件。

对元素大小不一致与尺寸编码长度异常分别保存样本。不要把某一个文件的补丁偏移复制给别的文件,偏移、校验和及底层布局都可能不同。恢复业务时一起核对正在产生的新文件和已有历史文件,避免只修未来写入,却让回溯任务继续失败。