目录
一 HDF5简介
1.1 HDF5背景
HDF5:(Hierarchical Data Format)是由美国伊利诺伊大学厄巴纳-香槟分校 UIUC (University of Illinois at Urbana-Champaign) 开发,是一种常见的跨平台数据储存文件,可以存储不同类型的图像和数码数据,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。
层次结构数据格式(HDF)实现了一个用于管理和存储数据的模型。该模型包括一个抽象数据模型和一个抽象存储模型(数据格式),以及用于实现抽象模型并将存储模型映射到不同的存储机制的库。HDF5库为抽象模型的具体实现提供了一个编程接口。该库还实现了一个数据传输模型,即数据从一个存储表示到另一个存储表示的有效移动。下图说明了模型和实现之间的关系。
抽象数据模型是数据、数据类型和数据组织的概念性模型。抽象数据模型独立于存储介质或编程环境。存储模型是抽象数据模型的对象的标准表示。HDF5文件格式规范定义了存储模型。
抽象数据模型是数据、数据类型和数据组织的概念性模型。抽象数据模型独立于存储介质或编程环境。存储模型是抽象数据模型的对象的标准表示。HDF5文件格式规范定义了存储模型。
该库是该编程模型的具体实现。该库将HDF5api导出为其接口。除了实现抽象数据模型的对象外,该库管理从一个存储表单到另一个存储表单的数据传输。数据传输示例包括从磁盘读取到内存和从内存写到磁盘。
存储数据是存储模型的具体实现。存储模型映射到多个存储机制,包括单个磁盘文件、多个文件(文件族)和内存表示。
HDF5库是一个C模块,它实现了编程模型和抽象数据模型。HDF5库调用操作系统或其他存储管理软件(例如,MPI/IO库)来存储和检索持久性数据。HDF5库还可以链接到其他软件,如过滤器进行压缩。HDF5库链接到一个可以用C、C、++、Fortran或Java编写的应用程序。该应用程序实现了特定于问题的算法和数据结构,并调用HDF5库来存储和检索数据。下图显示了这些模块的依赖关系。
重要的是要意识到,每个软件组件都使用适合于该组件的模型和数据结构来管理数据。当数据在层之间传递时(在存储或检索期间)时,它将从一种表示转换为另一种表示。下图显示了在不同层中使用的一些数据结构。应用程序程序使用表示问题的数据结构,以及算法,包括变量、表、数组和网格以及其他数据结构。根据其设计和功能,一个应用程序可能有相当多的不同类型的数据结构和不同的数量和大小的对象。
HDF5库实现了HDF5抽象数据模型的对象。其中一些对象包括组、数据集和属性。应用程序程序将应用程序数据结构映射到HDF5对象的层次结构。每个应用程序都将创建一个最适合其目的的映射。HDF5抽象数据模型的对象被映射到HDF5存储模型的对象,并存储在一个存储介质中。存储的对象包括头块、自由列表、数据块、b-树和其他对象。每个组或数据集都被存储为一个或多个标头和数据块。有关这些对象是如何组织的更多信息,请参阅HDF5文件格式规范。HDF5库还可以使用其他库和模块,如压缩。
需要注意的重要一点是,应用程序的对象、抽象数据模型和格式规范的对象之间不一定存在任何简单的对应关系。应用程序数据的组织,以及如何将其映射到HDF5抽象数据模型,都取决于应用程序开发人员。应用程序只需要处理库和抽象数据模型。大多数应用程序不需要考虑HDF5文件格式规范的任何细节,也不需要考虑抽象数据模型的对象如何转换到存储和进出存储的细节。
总而言之,HDF5是一种全新的分层数据格式产品,由数据格式规范和支持库实现组成。HDF5旨在解决较旧的HDF产品的一些限制,满足现代系统和应用需求。
1.2 抽象数据模型
抽象数据模型(ADM)定义了用于定义和描述存储在文件中的复杂数据的概念。ADM是一个非常通用的模型,它设计在概念上涵盖许多特定的模型。许多不同类型的数据可以被映射到ADM的对象上,因此可以使用HDF5进行存储和检索。然而,ADM并不是任何特定问题或应用程序领域的模型。用户需要将他们的数据映射到ADM的概念上。
关键概念包括:
File 文件-计算机存储区(内存、磁盘等)中的连续字节字符串,和字节表示零或更多的对象的模型组的对象(包括组)
Group组——对象(包括组)的集合数据。
Dataset数据集——多维数组的数据元素属性和其他元数据数据空间多维数组的维度的。
Dataspace数据空间-对一个多维数组的维度的描述。
Datatype数据类型 -对特定数据元素类的描述,包括它作为位模式的存储布局。
Attribute属性——与组、数据集或命名数据类型相关联的命名数据值
Property List属性列表——库中的一些参数(一些永久的和一些短暂的)控制选项。
Link链接——对象的连接方式。
下面将更详细地描述这些关键概念。
1.2.1 File
抽象地说,HDF5文件是一个有组织的对象集合的容器。这些对象是组、数据集和下面定义的其他对象。这些对象被组织成一个有根的有向图。每个HDF5文件都至少有一个对象,即根组。见下图。所有对象都是根组的成员或根组的后代。
HDF5对象在单个HDF5文件中有一个唯一的标识,并且只能通过其在文件层次结构中的名称来访问。不同文件中的HDF5对象不一定具有唯一的身份,而且除了通过一个文件之外,不可能访问一个永久的HDF5对象。
当创建文件时,文件创建属性将指定文件的设置。文件创建属性包括版本信息和全局数据结构的参数。打开文件时,文件访问属性将指定对文件的当前访问的设置。文件访问属性包括存储驱动程序的参数以及缓存和垃圾收集的参数。文件创建属性将被永久地设置为文件的使用寿命,并且可以通过关闭和重新打开文件来更改文件访问属性。
一个HDF5文件可以作为另一个HDF5文件的一部分进行“挂载”。这类似于Unix文件系统的挂载。挂载文件的根目录被附加到挂载文件中的一个组中,所有的内容都可以像挂载文件是挂载文件的一部分一样被访问。
1.2.2 Group
HDF5组类似于文件系统目录。抽象地说,一个组包含0个或多个对象,并且每个对象必须是至少一个组的成员。根组是一种特殊情况;它可能不是任何组的成员.
组成员身份实际上是通过链接对象来实现的。见下图。链接对象属于组,并指向已命名对象。每个链接都有一个名称,并且每个链接恰好指向一个对象。每个命名对象至少有一个或可能的链接。
命名对象有三类:组、数据集和已提交(命名)数据类型。见下图。这些对象都是至少一个组的成员,这意味着至少有一个链接。
1.2.3 Dataset
HDF5数据集是一个多维(矩形)数据元素数组。见下图。数组的形状(维数、每个维的大小)由数据空间对象进行描述(下一节将进行描述)。
数据元素是单个数据单元,它可以是数字、字符、数字或字符数组,或异构数据元素的记录。数据元素是一组位。位的布局由数据类型进行描述(见下文)
数据空间和数据类型是在创建数据集时设置的,并且在数据集的生命周期内不能更改它们。数据集创建属性将在创建数据集时进行设置。数据集的创建属性包括填充值和存储属性,如分块和压缩。在创建数据集后,不能更改这些属性。
数据集对象将管理对数据的存储和访问。虽然数据在概念上是一个连续的矩形阵列,但根据存储属性和所使用的存储机制,它以不同的方式进行物理存储和传输。实际的存储可以是一组压缩块,并且访问可以通过不同的存储机制和缓存。数据集在元素的概念数组和实际存储的数据之间进行映射。
1.2.4. Dataspace
HDF5数据空间描述了多维数组中元素的布局。从概念上讲,该数组是一个具有1到32维的超矩形。HDF5数据空间可以进行扩展。因此,每个维度都有一个当前大小和一个最大大小,并且最大大小可能是无限的。数据空间描述了这个超矩形:它是一个具有当前和最大(或无限)大小的尺寸列表。见下图。
数据空间对象也用于描述来自数据集的超实验室选择(hyperslab selections)。通过指定一组超实验室,可以选择数据集元素的任何子集来进行读取或写。一个非矩形区域可以通过多个(矩形)数据空间的联合来选择。
1.2.5. Datatype
HDF5数据类型对象描述了单个数据元素的布局。数据元素是数组的单个元素;它可以是单个数字、字符、数字或载体的数组,或其他数据。数据类型对象描述了此数据的存储布局。
数据类型被分为11类数据类型。每个类都根据一组规则进行解释,并有一组特定的属性来描述其存储。例如,浮点数具有指数位置和大小,可以根据适当的数字表示标准进行解释。因此,数据类型类告诉了元素的含义,而数据类型描述了它的存储方式。
下图显示了数据类型的分类。原子数据类型是不可分割的。每个对象都可以是单个对象,如数字或字符串。复合数据类型是由原子数据类型中的多个元素组成的。除了标准类型之外,用户还可以定义其他数据类型,如24位整数或16位浮点数。
数据集或属性具有一个与之关联的单一数据类型对象。见上图7。数据类型对象可以用于多个对象的定义,但默认情况下,数据类型对象的副本将是数据集私有的。
也可以选择将数据类型对象存储在HDF5文件中。数据类型被链接到一个组中,因此有一个名称。可以打开已提交的数据类型(以前称为已命名的数据类型),并以可以使用数据类型对象的任何方式进行使用。
1.2.6. Attribute
任何HDF5命名数据对象(组、数据集或命名数据类型)都可能具有零个或更多个用户定义的属性。属性用于记录该对象。对象的属性与该对象一起存储。
HDF5属性具有名称和数据。数据部分在结构上与数据集相似:数据空间定义了数据元素数组的布局,而数据类型定义了这些元素的存储布局和解释,见下图。
事实上,一个属性非常类似于数据集有以下限制:
- 一个属性只能通过对象访问
- 属性名称是重要的对象
- 一个属性应该是一个小对象
- 属性的数据必须读或写入一个访问(部分读或写是不允许的)
- 属性没有属性
1.2.7. Property List
HDF5有一个通用的属性列表对象。每个列表都是一个名称-值对的集合。每个类的属性列表都有一组特定的属性。每个属性都有一个隐式的名称、一个数据类型、和一个值。见下图。属性列表对象的创建和使用方式类似于HDF5库中的其他对象。
属性列表被附加到库中的对象上,库中的任何部分都可以使用它们。有些属性是永久性的(例如,数据集的分块策略),其他属性是短暂的(例如,用于数据传输的缓冲区大小)。属性列表的一个常用用法是将参数从调用程序传递给VFL驱动程序或管道中的一个模块。
属性列表在概念上类似于属性。属性列表是与库的行为相关的信息,而属性与用户的数据和应用程序相关。
属性列表用于控制文件创建、文件访问、数据集创建、数据集传输(读、写)和文件挂载的可选行为。下表中显示了一些属性列表类。本文档的相关部分将解释不同属性列表的详细信息。
1.2.8. Link
待补充。。。