hdf5与h5py

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LuyaoYing001/article/details/83048263

hdf5是美国超算中心开发的用于存储科学数据的自描述文件格式,与简单的二进制格式文件存储的最大区别是hdf5带有meta数据,这些元数据给出了数据的特征信息。hdf5有广泛的应用,matlab的.mat文件就是以hdf5作为保存文件的默认格式。

hdf5能够在学术界和业界流行开来,主要是因为hdf5有两个杀手级特性:层次性分组和特征。hdf5文件以分组形式来管理所有的数据集,就像文件系统里的目录一样。hdf5允许在组和数据集上附加描述性的元数据,帮助数据的使用者更好地理解数据的含义。

hdf5的另一个值得一说的优点在于支持子集分片和部分IO,hdf5文件大小可能多大几十G甚至TB规模,大多数机器不可能将如此大规模的数据集直接导入内存,切片操作会去寻找合适的数据并读入内存,并且因为做了底层优化而非常迅速。

除此之外,hdf5在底层完美地隐藏好了数据压缩、误差检测、分块传输等功能,这些对用户是透明的,用户在写入和读取数据的过程中不需要有额外的操作。

python语言近年来发展势头正盛,python社区也为hdf5提供了两个强大的处理库,h5py和PyTables。

安装
基本版的hdf5可以通过conda直接安装:

conda install h5py

使用

import h5py
import numpy as np

# 创建新文件写,覆盖已经存在的文件
f = h5py.File('test.hdf5','w')
# 创建group
f.create_group('grp1/grp2')
# 创建dataset
f.create_dataset('dset1', (100,), dtype = 'i')
data = np.arange(6).reshape(2,3)
f.create_dataset('grp1/grp2/dset2', data=data)
# 在HDF5的分块存储布局下创建:dataset被分为大小相同块随意地分布在磁盘上,并用B树建立索引
dset = f.create_dataset("autochunk", (1000, 1000), chunks=True)
# 高保真压缩
dset = f.create_dataset("zipped", (100, 100), compression="gzip")
# 创建属性
f['grp1'].attrs['a'] = 'xyz'
# 生成文件并退出
f.close()

# 以只读方式打开文件
f = h5py.File('test.hdf5','r')
# 读取dataset
print ('/grp1/grp2/dset2 = %s' % f['grp1/grp2/dset2'][:])
# 获取属性
print (f['grp1'].attrs['a'])
# 遍历文件
def printname(name):
    print(name)
f.visit(printname)
f.close()

猜你喜欢

转载自blog.csdn.net/LuyaoYing001/article/details/83048263