本节书摘来自异步社区《python和hdf 5大数据应用》一书中的第1章,第1.2节,作者[美]andrew collette(科莱特),胡世杰 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
hdf5是一种存储相同类型数值的大数组的机制,适用于可被层次性组织且数据集需要被元数据标记的数据模型。
它跟sql风格的关系型数据库区别相当大,hdf5在组织结构方面有一些特殊的技巧(第8章中有一个例子)。如果你需要在多个表上保持关系,或者想要在数据上进行join,那么一个关系型数据库可能更适合你。又或者你需要在一台没有安装hdf5的机器上读取一个小型的1维数据集,那么csv这样的文本格式是更合理的选择。
但如果你需要处理多维数组,对性能有非常高的要求,需要在数据集上支持子集分片和部分i/o,需要用特征来给数据集做标记,对关系型特性没有要求,那么hdf5就是完美的选择。
那么说到底,“hdf5”究竟是指什么?我确信它包含下面3点:
1.一种文件规格及相关的数据模型;
2.一个可被c、c++、java,python以及其他语言使用的api标准库;
3.一个软件生态系统,由使用hdf5的客户程序以及matlab、idl和python等“分析平台”组成。
你已经在上面的例子见到hdf5数据模型的三大要素:
数据集:一种数组型对象,在磁盘上保存数值类型的数据;
组:层次性容器,可以包含数据集和子组;
特征:自定义元数据信息,可被附加在数据集(以及组!)上。
用户可以使用这些基本抽象构建适合自己问题域的应用格式。比如,我们之前的气象站代码为每个气象站分了一个组,为每个测量参数分配一个数据集,并附加了一些特征以描述数据集的额外信息。这种统一使用“格式内格式”来决定如何用组、数据集和特征来保存信息的方式在实验室或者其他机构中是非常普遍的。
既然hdf5处理一切如“endian”的跨平台问题,数据的分享就只需要对组、数据集和特征进行简单操作并获得结果。由于文件是自我描述的,你甚至不需要了解应用格式就可以从文件中获取数据。你只需打开文件并浏览其内容:

任何曾经在读取“简单”二进制格式文件上花费数小时琢磨字节偏移量的人都应该对此充满感激。
最后,hdf5文件的底层字节布局是开放的规格。比起专利软件的二进制格式,这里面没有任何隐秘。虽然基本上人们都会使用hdf组织提供的库来访问这些文件,但是你自己写一个软件去读也没有任何问题。
该库主要用c语言写成,对c++和java有一些额外的绑定。人们说起“hdf5”时通常就是指这个库。两大脍炙人口的python接口模块pytables和h5py使用的就是这个由hdf组织提供的c库。
这个标准库最主要的一点在于开发者对它的积极维护以及在向下兼容方面花费的巨大精力。标准库的向下兼容不仅仅是api的兼容,亦包括文件格式的兼容。对于hdf5这样的归档文件格式来说,兼容性是一个非常必需的特性。而api兼容则使h5py和pytables这样的模块有能力处理世界上各种不同版本的hdf5。
对于科学数据的存储,包括长期的存储,你应该对hdf5有信心。由于标准库和文件格式都是开源的,哪怕一颗流星摧毁了伊利诺伊州,你的文件依然能够被读取。
最后,让hdf5特别有用的一个原因是你可以在几乎任何平台上读写文件。idl语言已经支持hdf5好多年了;matlab现在甚至以hdf5作为其“.mat”保存文件的默认格式;python、c++、java、.net和labview以及其他语言对其都有支持。nasa地球观测系统等机构用户使用的“eos5”格式是建立在hdf5容器之上的应用格式,刚才我们见到的其实是其简化以后的例子。甚至作为hdf5竞争对手之一的netcdf,其最新的netcdf4格式也是实现在hdf5的组、数据集和特征之上。
希望我上面介绍的这些能够让你了解hdf5在科学用途上所向披靡的原因。接下来,我们将看到hdf5工作的基本原理并开始在python上使用它。