HDF

层级数据格式（Hierarchical Data Format：HDF）是设计用来存储和组织大量数据的一组文件格式（HDF4，HDF5）。它最初开发于美国国家超级计算应用中心，现在由非营利社团HDF Group支持，其任务是确保HDF5技术的持续开发和存储在HDF中数据的持续可访问性。
伴随着这个目标，HDF库和相关工具可在自由的类BSD许可证下获得用于一般使用。HDF被很多商业和非商业软件平台所支持，包括Java、MATLAB、Scilab、Octave、Mathematica、IDL、Python、R、Fortran和Julia。可免费获得的HDF发行中包括了库，命令行实用程序，测试套件源代码，Java接口，和基于Java的HDF查看器（HDFView）。
当前版本是HDF5，在设计和API上与主要的遗留版本HDF4有显着区别。

**历史**
在1987年由美国国家超级计算应用中心（NCSA）的图形基础任务攻坚组（GFTF），着手建立一种架构无关的软件库和文件格式，致力于满足NCSA在当时使用的多种不同计算平台之间，移送科学数据的需要。额外的目标还包括：有效的存储和访问大对象的能力，在一个容器内存储不同类型的众多对象的能力，增长格式来容纳新类型的对象和对象元数据的能力，用C和Fortran二者的程序访问存储数据的能力。最初称为AEHOO（全包容层级面向对象格式），新软件和文件格式，最终叫做层级数据格式（HDF）。HDF的设计组合了来自很多不同格式的想法，包括TIFF、CGM、FITS和Macintosh PICT格式。这个计划在1990年和1992年，收到了美国国家科学基金会（NSF）的至关重要的拨款。大约1990年代早期美国国家航空航天局（NASA），研究了用在Earth Observing System（EOS）计划中的15种不同文件格式。在两年评述过程之后，HDF被选择为EOS数据和信息系统的标准格式。
1996年美国能源部的劳伦斯利弗摩尔、洛斯阿拉莫斯和桑迪亚国家实验室与NCSA，抽调人员成立了数据建模和格式（DMF）小组，研究满足高级模拟和计算规划（ASC）需要的并行I/O能力的文件格式。在NASA的额外支持下，三实验室与NCSA，联合开发了第一版的HDF5并于1998年发行。在2007年NASAEarth Observing System推荐使用HDF-EOS5。

**HDF4**
HDF4是这个格式的较老版本，它支持可增殖的不同数据模型，包括了多维阵列、光栅图像和表格。每种都定义了特定的聚集数据类型，并提供一个API用来读取、写入、组织数据和元数据。HDF开发者和用户可以增加新数据模型。
HDF是自描述的，允许应用程序解释文件的结构和内容而不需要外部信息。一个HDF文件可以持有混合的有关联的对象，它们可以作为一个群组或作为个别对象来访问。用户可以建立自己的叫做“vgroups”的群组结构。

HDF4格式有很多限制。它缺乏清晰的对象模型，这导致持难于持续支持和改进。支持多种不同的接口风格（图像、表格、阵列）导致了复杂的API。对元数据的支持依赖于使用的是哪个接口；SD（科学数据集）对象支持任意命名属性，而其他类型只支持预定义的元数据。可能最重要的问题，是使用32-bit位有符号整数寻址，限制了HDF4文件大小极大为2GB，这在很多现代科学应用中是不可接受的。它仍被HDF Group活跃支持着，可见于其支持页面。

**HDF5**
HDF结构举例
HDF5格式被设计解决HDF4库的某些限制，并致力于满足现代系统和应用的当前和预期要求。
HDF5简化了文件结构，只包含两种主要的对象类型：
*数据集，它是同质类型的多维阵列；
*群组，它是持有数据集和其他群组的容器结构。
这真正产生了层级的、类似文件系统的数据格式。事实上，在HDF5文件中的资源可以使用类似POSIX语法的“/路径/至/资源”来访问。元数据以用户定义形式存储，命名特性附加到群组和数据集之上。表示图形和表格的更复杂存储API，可以接着使用数据集、群组和特性来建造起来。
除了这些在文件格式上的进步，HDF5包括了改进的类型系统，和表示在数据集区域上选择的数据空间对象。API是面向对象的，有关于数据集、群组、特性、类型、数据空间和属性列表。
最新版的NetCDF版本4基于了HDF5。
由于它使用了B树来索引表格对象，HDF5有效工作于时间序列数据，比如股价序列，网络监控数据，和3D气象数据。大批量的数据直接进入阵列（表格对象），它可以比SQL数据库的行存储更快访问，而非阵列的数据可获得B树访问。HDF5数据存储机制比SQLStar schema更简单和快速。

**批评**
对HDF5的批评来源于它的单体设计和冗长规定。
*HDF5不强制使用UTF-8，所以客户应用可能在多数位置上都预期ASCII码。
*在文件中的数据集数据不能释放，除非使用外部工具（h5repack）生成文件复本。

**接口**

**官方支持的API**
 C- C++- CLI - .Net- Fortran，Fortran 90- HDF5 Lite (H5LT) – 轻量级C接口- HDF5 Image (H5IM) – 图像和光栅的C接口- HDF5 Table (H5TB) – 表格的C接口- HDF5 Packet Table (H5PT) – 处理“包”数据的C和C++接口，高速访问- HDF5 Dimension Scale (H5DS) – 允许向HDF5增加维度缩放 
*Java

**第三方绑定**
 CGNS，使用HDF5作为主存储。- Common Lisp，通过hdf5-cffi库访问。- D语言，提供到C API的绑定，有着高层h5py风格的包装器正在开发。- Dymola，使用叫做科学数据格式（SDF）的实现支持HDF5导出，自从Dymola 2016 FD01发行。- Erlang、Elixir和LFE语言，可以使用BEAM语言绑定。- GNU数据语言，支持访问HDF5和HDF4。- Go语言，通过gonum的hdf5包。- HDFql，使用户能用C、C++、Java、Python、C#、Fortran和R语言通过高层语言（类似SQL）管理HDF5文件。- Huygens软件，自从版本3.5使用HDF5作为主存储。- IDL，提供访问HDF5的API。- IGOR Pro，提供对HDF5文件的完全支持。- JHDF5库，是一个可替代的Java绑定，采用了与官方HDF5 Java绑定不同的方式，一些用户觉得更简单。- jHDF库，一个纯Java实现，提供了对HDF5文件的只读访问。- JSON，通过hdf5-json。- Julia语言，通过HDF5包提供HDF5支持。- LabVIEW，可以通过第三方库获得HDF支持，比如h5labview和lvhdf5。- Lua，通过lua-hdf5库。- MATLAB、Scilab或Octave，在新近发行中使用HDF5作为主存储格式。- Mathematica HDF导入和导出，提供HDF和HDF5数据的直接分析。- Perl语言，通过PDL::IO::HDF5访问。- Python语言，对于HDF5，可通过支持抽象高层访问和低层访问二者的h5py，或通过具有高级索引和类似数据库查询能力的高层接口的PyTables。对于HDF4，可通过Python-HDF4和/或PyHDF。流行的数据操纵包pandas可以通过PyTables导入和导出HDF5。- R语言，通过rhdf5和hdf5r包提供支持。- Rust语言，通过第三方库获得HDF支持，比如hdf库。

**工具**
 Apache Spark HDF5 Connector，用于Apache Spark的HDF5连接器- Apache Drill HDF5 Plugin，用于Apache Drill的HDF5插件，允许在HDF5文件集上执行SQL查询- HDF Product Designer，可互操作的HDF5数据产品建立GUI工具- HDF Explorer，可读取HDF、HDF5和netCDF的数据可视化程序- HDFView，基于Java的HDF文件的浏览器和编辑器- ViTables，用Python写的HDF5和PyTables文件的浏览器和编辑器- Panoply，基于Java的netCDF、HDF和GRIB数据查看器

**参见**
通用数据格式 (CDF)
*FITS，用于天文学的数据格式
*GRIB (GRIdded Binary)，用于气象学的数据格式
*NetCDF，Netcdf Java库使用纯Java读取HDF5、HDF4、HDF-EOS和其他格式 
*Protocol Buffers，Google的数据交换格式

**引用**

**外部链接**
 What is HDF5? date=20210118110412 - HDF-EOS Tools and Information Center date=20201105151319 - Open Navigation Surface date=20201209231650 - HDF5使用简介