如何判断使用h5py创建的HDF5文件是否采用了压缩(无需读取数据)
HDF5文件压缩状态判断方案(无需读取实际数据)
核心结论
可以实现,整个判断过程只会读取HDF5文件的元数据,不会加载任何数据集的实际存储内容,效率极高。
实现原理
HDF5的压缩配置属于数据集的元数据信息,直接存储在文件头中,h5py访问该类属性时不会触发数据集内容的读取操作。如果数据集的compression属性不为空,即代表该数据集使用了压缩。
代码实现
1. 判断指定数据集是否压缩
import h5py def is_dataset_compressed(h5_file_path, dataset_path): # 只读模式打开文件,不会修改原文件 with h5py.File(h5_file_path, 'r') as f: target_dset = f[dataset_path] # 仅访问元数据属性,不读取数据集实际内容 return target_dset.compression is not None
返回值说明:True为使用了压缩,False为未使用压缩。
2. 扫描整个文件判断是否存在任意压缩数据集
如果需要判断整个文件内是否有任何一个数据集使用了压缩,可以用递归遍历的方式实现:
import h5py def has_compressed_dset_in_file(h5_file_path): def scan_node(name, node_obj): # 仅判断数据集类型节点,跳过组节点 if isinstance(node_obj, h5py.Dataset) and node_obj.compression is not None: scan_node.has_compressed = True scan_node.has_compressed = False with h5py.File(h5_file_path, 'r') as f: # 遍历文件内所有节点,不会加载任何数据集内容 f.visititems(scan_node) return scan_node.has_compressed
补充说明
- 如果需要获取具体的压缩算法类型,直接读取
compression属性即可,返回值为gzip/lzf/szip等对应压缩算法的字符串标识 - 如需获取压缩参数(比如gzip的压缩级别),可访问数据集的
compression_opts属性,以上两个属性均属于元数据范畴,不会触发数据加载
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

