层级数据格式(Hierarchical Data Format:HDF)是设计用来存储和组织大量数据的一组文件格式(HDF4HDF5)。它最初开发于美国国家超级计算应用中心,现在由非营利社团HDF Group支持,其任务是确保HDF5技术的持续开发和存储在HDF中数据的持续可访问性。

Hierarchical Data Format
HDF Group的logo
扩展名.hdf, .h4, .hdf4, .he2, .h5, .hdf5, .he5
互联网媒体类型application/x-hdf、​application/x-hdf5
开发者The HDF Group
最新版本
HDF5-1.14.4[1]在维基数据编辑(2024年4月11日,11天前)
格式类型科学数据格式
免费格式?
网站www.hdfgroup.org/solutions/hdf5 編輯維基數據鏈接

伴随着这个目标,HDF库和相关工具可在自由的类BSD许可证下获得用于一般使用。HDF被很多商业和非商业软件平台所支持,包括JavaMATLABScilabOctaveMathematicaIDLPythonRFortranJulia。可免费获得的HDF发行中包括了库,命令行实用程序,测试套件源代码,Java接口,和基于Java的HDF查看器(HDFView)[2]

当前版本是HDF5,在设计和API上与主要的遗留版本HDF4有显著区别。

历史 编辑

在1987年由美国国家超级计算应用中心(NCSA)的图形基础任务攻坚组(GFTF),着手建立一种架构无关的软件库和文件格式,致力于满足NCSA在当时使用的多种不同计算平台之间,移送科学数据的需要。额外的目标还包括:有效的存储和访问大对象的能力,在一个容器内存储不同类型的众多对象的能力,增长格式来容纳新类型的对象和对象元数据的能力,用C和Fortran二者的程序访问存储数据的能力。最初称为AEHOO(全包容层级面向对象格式),新软件和文件格式,最终叫做层级数据格式(HDF)。HDF的设计组合了来自很多不同格式的想法,包括TIFFCGMFITSMacintosh PICT英语PICT格式。这个计划在1990年和1992年,收到了美国国家科学基金会(NSF)的至关重要的拨款。大约1990年代早期美国国家航空航天局(NASA),研究了用在地球观测系统英语Earth Observing System(EOS)计划中的15种不同文件格式。[3]在两年评述过程之后,HDF被选择为EOS数据和信息系统的标准格式[4]

1996年美国能源部劳伦斯利弗摩尔洛斯阿拉莫斯桑迪亚国家实验室与NCSA,抽调人员成立了数据建模和格式(DMF)小组,研究满足高级模拟和计算规划(ASC)需要的并行I/O能力的文件格式。在NASA的额外支持下,三实验室与NCSA,联合开发了第一版的HDF5并于1998年发行。[3]在2007年NASA地球观测系统英语Earth Observing System推荐使用HDF-EOS5[5]

HDF4 编辑

HDF4是这个格式的较老版本,它支持可增殖的不同数据模型,包括了多维阵列、光栅图像和表格。每种都定义了特定的聚集数据类型,并提供一个API用来读取、写入、组织数据和元数据。HDF开发者和用户可以增加新数据模型。

HDF是自描述的,允许应用程序解释文件的结构和内容而不需要外部信息。一个HDF文件可以持有混合的有关联的对象,它们可以作为一个群组或作为个别对象来访问。用户可以建立自己的叫做“vgroups”的群组结构。

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

HDF5 编辑

 
HDF结构举例

HDF5格式被设计解决HDF4库的某些限制,并致力于满足现代系统和应用的当前和预期要求。

HDF5简化了文件结构,只包含两种主要的对象类型:

  • 数据集,它是同质类型的多维阵列
  • 群组,它是持有数据集和其他群组的容器结构。

这真正产生了层级的、类似文件系统的数据格式。事实上,在HDF5文件中的资源可以使用类似POSIX语法的“/路径/至/资源”来访问。元数据以用户定义形式存储,命名特性附加到群组和数据集之上。表示图形和表格的更复杂存储API,可以接着使用数据集、群组和特性来建造起来。

除了这些在文件格式上的进步,HDF5包括了改进的类型系统,和表示在数据集区域上选择的数据空间对象。API是面向对象的,有关于数据集、群组、特性、类型、数据空间和属性列表。

最新版的NetCDF版本4基于了HDF5。

由于它使用了B树来索引表格对象,HDF5有效工作于时间序列数据,比如股价序列,网络监控数据,和3D气象数据。大批量的数据直接进入阵列(表格对象),它可以比SQL数据库的行存储更快访问,而非阵列的数据可获得B树访问。HDF5数据存储机制比SQL星模式英语Star schema更简单和快速。

批评 编辑

对HDF5的批评来源于它的单体设计和冗长规定。

  • HDF5不强制使用UTF-8,所以客户应用可能在多数位置上都预期ASCII码。
  • 在文件中的数据集数据不能释放,除非使用外部工具(h5repack)生成文件复本[9]

接口 编辑

官方支持的API 编辑

  • C
  • C++
  • CLI - .Net
  • FortranFortran 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库访问[10]
  • D语言,提供到C API的绑定[11],有着高层h5py风格的包装器正在开发。
  • Dymola[12],使用叫做科学数据格式(SDF)的实现支持HDF5导出,自从Dymola 2016 FD01发行。
  • ErlangElixirLFE英语LFE (programming language)语言,可以使用BEAM语言绑定[13]
  • GNU数据语言,支持访问HDF5和HDF4。
  • Go语言,通过gonum[14]的hdf5包[15]
  • HDFql[16],使用户能用C、C++、Java、Python、C#、Fortran和R语言通过高层语言(类似SQL)管理HDF5文件。
  • Huygens软件[17],自从版本3.5使用HDF5作为主存储。
  • IDL,提供访问HDF5的API。
  • IGOR Pro[18],提供对HDF5文件的完全支持[19]
  • JHDF5库[20],是一个可替代的Java绑定,采用了与官方HDF5 Java绑定不同的方式,一些用户觉得更简单。
  • jHDF库[21],一个纯Java实现,提供了对HDF5文件的只读访问。
  • JSON,通过hdf5-json[22]
  • Julia语言,通过HDF5包[23]提供HDF5支持。
  • LabVIEW,可以通过第三方库获得HDF支持,比如h5labview[24]和lvhdf5[25]
  • Lua,通过lua-hdf5[26]库。
  • MATLABScilabOctave,在新近发行中使用HDF5作为主存储格式。
  • Mathematica HDF导入和导出[27],提供HDF和HDF5数据的直接分析。
  • Perl语言,通过PDL::IO::HDF5访问[28]
  • Python语言,对于HDF5,可通过支持抽象高层访问和低层访问二者的h5py[29],或通过具有高级索引和类似数据库查询能力的高层接口的PyTables[30]。对于HDF4,可通过Python-HDF4[31]和/或PyHDF[32]。流行的数据操纵包pandas可以通过PyTables导入和导出HDF5。
  • R语言,通过rhdf5[33]和hdf5r[34]包提供支持。
  • Rust语言,通过第三方库获得HDF支持,比如hdf库[35]

工具 编辑

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

参见 编辑

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

引用 编辑

  1. ^ HDF5 1.14.4. 2024年4月11日. 
  2. ^ Java-based HDF Viewer (HDFView). [2019-06-05]. (原始内容存档于2016-08-11). 
  3. ^ 3.0 3.1 HDF Group History. [2019-06-08]. (原始内容存档于2019-06-08). 
  4. ^ HDF-EOS Tools and information Center. [2023-10-09]. (原始内容存档于2023-10-21). 
  5. ^ HDF-EOS5 Data Model, File Format and Library. [2023-10-09]. (原始内容存档于2023-11-10). 
  6. ^ How is HDF5 different from HDF4?. [2019-06-05]. (原始内容存档于2009-03-30). 
  7. ^ Are there limitations to HDF4 files?. [2019-06-05]. (原始内容存档于2016-04-19). 
  8. ^ 支持页面页面存档备份,存于互联网档案馆
  9. ^ Rossant, Cyrille. Moving away from HDF5. cyrille.rossant.net. [21 April 2016]. (原始内容存档于2016-01-08). 
  10. ^ hdf5-cffi页面存档备份,存于互联网档案馆
  11. ^ 到C API的绑定页面存档备份,存于互联网档案馆
  12. ^ Dymola页面存档备份,存于互联网档案馆
  13. ^ BEAM语言绑定页面存档备份,存于互联网档案馆
  14. ^ gonum页面存档备份,存于互联网档案馆
  15. ^ hdf5页面存档备份,存于互联网档案馆
  16. ^ HDFql页面存档备份,存于互联网档案馆
  17. ^ Huygens软件页面存档备份,存于互联网档案馆
  18. ^ IGOR Pro页面存档备份,存于互联网档案馆
  19. ^ Igor Pro includes extensive support for reading and writing HDF5 files through an included HDF5 package页面存档备份,存于互联网档案馆).
  20. ^ JHDF5库页面存档备份,存于互联网档案馆
  21. ^ jHDF库页面存档备份,存于互联网档案馆
  22. ^ hdf5-json页面存档备份,存于互联网档案馆
  23. ^ HDF5页面存档备份,存于互联网档案馆
  24. ^ h5labview页面存档备份,存于互联网档案馆
  25. ^ lvhdf5页面存档备份,存于互联网档案馆
  26. ^ lua-hdf5页面存档备份,存于互联网档案馆
  27. ^ HDF Import and Export页面存档备份,存于互联网档案馆)Mathematica documentation
  28. ^ PDL::IO::HDF5. [2019-06-05]. (原始内容存档于2019-06-05). 
  29. ^ h5py页面存档备份,存于互联网档案馆
  30. ^ PyTables页面存档备份,存于互联网档案馆
  31. ^ Python-HDF4页面存档备份,存于互联网档案馆
  32. ^ PyHDF页面存档备份,存于互联网档案馆
  33. ^ rhdf5页面存档备份,存于互联网档案馆
  34. ^ hdf5r页面存档备份,存于互联网档案馆
  35. ^ hdf5页面存档备份,存于互联网档案馆
  36. ^ Apache Spark HDF5 Connector
  37. ^ Apache Drill HDF5 Plugin
  38. ^ HDF Product Designer页面存档备份,存于互联网档案馆
  39. ^ HDF Explorer页面存档备份,存于互联网档案馆
  40. ^ HDFView页面存档备份,存于互联网档案馆
  41. ^ ViTables页面存档备份,存于互联网档案馆
  42. ^ Panoply. [2023-08-11]. (原始内容存档于2023-11-09). 

外部链接 编辑