1、介绍
HDF 是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要。HDF 可以表示出科学数据存储和分布的许多必要条件。HDF 被设计为:
- 自述性:对于一个HDF 文件里的每一个数据对象,有关于该数据的综合信息(元数据)。在没有任何外部信息的情况下,HDF 允许应用程序解释HDF文件的结构和内容。
- 通用性:许多数据类型都可以被嵌入在一个HDF文件里。例如,通过使用合适的HDF 数据结构,符号、数字和图形数据可以同时存储在一个HDF 文件里。
- 灵活性:HDF允许用户把相关的数据对象组合在一起,放到一个分层结构中,向数据对象添加描述和标签。它还允许用户把科学数据放到多个HDF 文件里。
- 扩展性:HDF极易容纳将来新增加的数据模式,容易与其他标准格式兼容。
- 跨平台性:HDF 是一个与平台无关的文件格式。HDF 文件无需任何转换就可以在不同平台上使用。
2、HDF5的文件组织
一个HDF5文件就是一个由两种基本数据对象(groups and datasets)存放多种科学数据的容器:
- HDF5 group: 包含0个或多个HDF5对象以及支持元数据(metadata)的一个群组结构
- HDF5 dataset: 数据元素的一个多维数组以及支持元数据(metadata)

- Datatypes: Datatypes描述数据集中单个数据元素的数据类型,如下图的32位整数

- Dataspaces: Dataspaces描述数据集数据元素的布局。下图为3*5的2维(rank)数组

- Properties: Properties适用于描述hdf5文件的特征,通过修改这些性能,可以提高存储效率。比如默认情况下,数据是连续分布的,为了更好的效能,可以将数据分割成块并压缩。

- Attributes: 与hdf5文件关联的文件,包含两个部分,名字和值,通俗点讲就是一个描述文件。
3、dataset介绍
3.1 storage layout 存储布局
存储布局分为三种:
- Contiguous (连续):默认布局,数据以与内存中组织的线性方式相同的方式进行存储。
- Compact (紧凑):数据量很小并且可以直接存储在对象头中时使用。
- Chunked (分块):将数据集分成相同大小的“块”,分别存储,只有当前布局支持压缩。 分块有三个重要的好处。
- 即使当要选择的子集与数据集的正常存储顺序正交时,也可以在访问数据集的子集时实现良好的性能。
- 它可以压缩大型数据集,并在访问数据集的子集时仍能获得良好的性能。
- 它可以有效地在任何方向上扩展数据集的维度。
以下为同一个项目的数据,在不同布局和chunked大小的H5文件对比,当前使用GZIP压缩,压缩等级为6。当前算法输出的为6x566415.h5。

相对于连续和未压缩的chunked文件,压缩后基本上都只有未压缩的25%左右,所以在大数量的情况下,建议使用chunked分块布局并开启压缩。
3.2 filter 过滤器
HDF5使用过滤器的概念,针对数据进行前后处理。以下为支持的几种过滤器。
- GZIP:GZIP压缩的过滤器;
- SZIP:SZIP压缩的过滤器;
- SHUF:对字节的位置进行变换,用于提高压缩性能的过滤器。(To improve compression performance, data is regrouped by its byte position in the data unit. In other words, the 1st, 2nd, 3rd, and 4th bytes of integers are stored together respectively.)
- FLET:总和校验的过滤器
- NBIT:针对n-bit这种数据类型定制的压缩算法。(Data compression using an algorithm specialized for n-bit datatypes.)
- SOFF:Scale-offset compression,Data compression using using a “scale and offset” algorithm.
- UD:user-defined ,用户自定义的过滤器。
- NONE:无过滤器。
4、HDF5 API库
API/库 | 优点 | 缺点 | 性能 |
HDF5 JNI |
|
| 大chunk块情况下,性能低于JHDF |
HDFql |
|
| 性能较慢 |
jHDF |
|
| 大chunk块情况下,性能高于HDF5-JNI。作者推荐根据自己的实际场景进行实测以确定最佳的chunk大小。 |
|
| 无chunk分块读取API |
注:Hyperslabs是数据集的一部分。 hyperslab选择可以是点的逻辑上连续的集合中的数据空间,或者它可以是在数据空间点或块的规则图案
摘抄自: Parallel IO Improvements • Peter Kirkham (pkirkham.github.io)
5、hdf5周边工具
gif2h5/h52gif:转换GIF和HDF5的工具;
- h5diff:比较HDF5文件差异的工具;
- h5dump:可以从HDF5文件中导出ASCII文件的工具;
- h5import:可以导入ASCII或者二进制到HDF5中的工具;
- h5perf:HDF5性能工具;
- h5redeploy:可以新部署HDF5编译工具;
- h5repack:可以拷贝HDF5文件并且重新指定布局、分块大小和压缩比例等的工具;
- h5repart:HDF5的分割工具;
















