HDF5
层级数据格式(Hierarchical Data Format:HDF)是设计用来存储和组织大量数据的一组文件格式(HDF4,HDF5)。它最初开发于美国国家超级计算应用中心,现在由非营利社团HDF Group支持,其任务是确保HDF5技术的持续开发和存储在HDF中数据的持续可访问性。
HDF5组成
- HDF5 group: 包含多个HDF5数据对象/元数据的组织结构,类似文件管理的数据组织形式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O5rrcL1S-1624525861210)(HDF5.assets/group.png)]
There are two groups in the HDF5 file depicted above: Viz and SimOut. Under the Viz group are a variety of images and a table that is shared with the SimOut group. The SimOut group contains a 3-dimensional array, a 2-dimensional array and a link to a 2-dimensional array in another HDF5 file.
- HDF5 dataset: 包含多维数组的数据,以及描述数据的元数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qaocDkKL-1624525861216)(HDF5.assets/dataset.png)]
Datatypes, dataspaces, properties 以及 (optional) attributes,是用来描述HDF5数据的元数据
数据样例1:
HDF5 "C:/Users/******/Desktop/h5ex_t_array.h5" {
GROUP "/" {
DATASET "DS1" {
DATATYPE H5T_ARRAY { [3][5] H5T_STD_I64LE } // 派生的数据类型
DATASPACE SIMPLE { ( 4 ) / ( 4 ) }
DATA {
(0): [ 0, 0, 0, 0, 0,
0, -1, -2, -3, -4,
0, -2, -4, -6, -8 ],
(1): [ 0, 1, 2, 3, 4,
1, 1, 1, 1, 1,
2, 1, 0, -1, -2 ],
(2): [ 0, 2, 4, 6, 8,
2, 3, 4, 5, 6,
4, 4, 4, 4, 4 ],
(3): [ 0, 3, 6, 9, 12,
3, 5, 7, 9, 11,
6, 7, 8, 9, 10 ]
}
}
}
}
元数据
Datatypes(数据类型)
datatypes用来描述dataset中数据的类型,同时也是完成数据转换的充分必要的信息。大致概括如下:
Pre-Defined Datatypes: HDF5预定义的数据类型,有以下两种(见样例数据2)
标准datatypes:即在所有平台通用的数据格式,如:H5T_IEEE_F32BE表示标准大端浮点类型
私有datatypes:即不是所有平台通用的数据格式,如:HDF5中的H5T_NATIVE_INT对应于C语言的int
Derived Datatypes:由上述pre-defined datatypes派生出来的数据类型(见样例数据1)
样例数据2:
HDF5 "C:/Users/wengjianhong/Desktop/h5ex_d_compact.h5" {
GROUP "/" {
DATASET "DS1" {
DATATYPE H5T_STD_I32LE // 标准预定义数据类型,int
DATASPACE SIMPLE { ( 4, 7 ) / ( 4, 7 ) }
DATA {
(0,0): 0, -1, -2, -3, -4, -5, -6,
(1,0): 0, 0, 0, 0, 0, 0, 0,
(2,0): 0, 1, 2, 3, 4, 5, 6,
(3,0): 0, 2, 4, 6, 8, 10, 12
}
}
}
Dataspaces(数据空间)
数据空间这个词是自己翻译的出来的,总感觉有点别扭。。。
Dataspaces用来表示数据的布局,比如下面图片表示dataset的秩是3,并且是一个5*3的二维数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6k49iT4t-1624525861218)(HDF5.assets/dataspace1.png)]
数据空间的另一个作用是:可以用来选择数据集中的一个分片,如下图(具体怎么用不太懂)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7qWOfzF8-1624525861221)(HDF5.assets/dataspace.png)]
Properties(数据特性)
Properties用来表述数据的特性,大部分情况下可以使用默认属性。也可以通过HDF5 Property List API调整以获得更好的性能。
例如,数据集的数据存储布局属性默认是连续的。为了更好的性能,布局可以被修改为分块或分块和压缩:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5EUUO2xp-1624525861225)(HDF5.assets/properties.png)]
Attributes(对象属性)
对象属性可以和HDF5数据对象相关联,属性包含:属性名和属性值,必须依赖所属对象进行访问,所以可以认为对象属性不是独立的对象。
Attributes和Dataset类似,两者都有datatype和dataspace,然而,对象属性不支持IO操作、数据压缩或扩展
样例数据3(数据存放在DATASET)
HDF5 "C:/Users/wengjianhong/Desktop/h5ex_t_array.h5" {
GROUP "/" {
DATASET "DS1" {
DATATYPE H5T_ARRAY { [3][5] H5T_STD_I64LE }
DATASPACE SIMPLE { ( 4 ) / ( 4 ) }
DATA {
(0): [ 0, 0, 0, 0, 0,
0, -1, -2, -3, -4,
0, -2, -4, -6, -8 ],
(1): [ 0, 1, 2, 3, 4,
1, 1, 1, 1, 1,
2, 1, 0, -1, -2 ],
(2): [ 0, 2, 4, 6, 8,
2, 3, 4, 5, 6,
4, 4, 4, 4, 4 ],
(3): [ 0, 3, 6, 9, 12,
3, 5, 7, 9, 11,
6, 7, 8, 9, 10 ]
}
}
}
}
样例数据3(数据存放在Attributes)
HDF5 "C:/Users/wengjianhong/Desktop/h5ex_t_arrayatt.h5" {
GROUP "/" {
DATASET "DS1" {
DATATYPE H5T_STD_I32LE
DATASPACE NULL
DATA {
}
ATTRIBUTE "A1" {
DATATYPE H5T_ARRAY { [3][5] H5T_STD_I64LE }
DATASPACE SIMPLE { ( 4 ) / ( 4 ) }
DATA {
(0): [ 0, 0, 0, 0, 0,
0, -1, -2, -3, -4,
0, -2, -4, -6, -8 ],
(1): [ 0, 1, 2, 3, 4,
1, 1, 1, 1, 1,
2, 1, 0, -1, -2 ],
(2): [ 0, 2, 4, 6, 8,
2, 3, 4, 5, 6,
4, 4, 4, 4, 4 ],
(3): [ 0, 3, 6, 9, 12,
3, 5, 7, 9, 11,
6, 7, 8, 9, 10 ]
}
}
}
}
}
API分类
API | DESCRIPTION |
---|---|
H5 | Library Functions: general-purpose H5 functions |
H5A | Annotation Interface: attribute access and manipulation routines |
H5D | Dataset Interface: dataset access and manipulation routines |
H5E | Error Interface: error handling routines |
H5F | File Interface: file access routines |
H5G | Group Interface: group creation and operation routines |
H5I | Identifier Interface: identifier routines |
H5L | Link Interface: link routines |
H5O | Object Interface: object routines |
H5P | Property List Interface: object property list manipulation routines |
H5R | Reference Interface: reference routines |
H5S | Dataspace Interface: dataspace definition and access routines |
H5T | Datatype Interface: datatype creation and manipulation routines |
H5Z | Compression Interface: compression routine(s) |
HDF5程序开发和APIs介绍
创建一个文件
- 指定属性或者使用默认值
- 创建文件
- 关闭文件
#include “hdf5.h”
int main() {
hid_t file_id;
herr_t status;
// H5F_ACC_TRUNC: 如果文件已存在,则覆盖, H5P_DEFAULT:默认配置项
file_id = H5Fcreate ("file.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
status = H5Fclose (file_id);
}
创建一个dataset
- 设置 dataset 属性(datatype, dataspace, properties).
- 决定将 dataset 附加到哪个group
- 创建 dataset
- 关闭 dataset
/* Create the dataspace for the dataset. */
dims[0] = 4;
dims[1] = 6;
dataspace_id = H5Screate_simple(2, dims, NULL);
/* Create the dataset. */
dataset_id = H5Dcreate (file_id, "/dset", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
/* Close the dataset and dataspace */
status = H5Dclose(dataset_id);
status = H5Sclose(dataspace_id);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TTFFvQDg-1624525861227)(HDF5.assets/crtdset.png)]
读/写dataset
#include “hdf5.h”
int main() {
hid_t file_id;
herr_t status;
/* Create the h5 file. */
file_id = H5Fcreate ("dset.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
/* Create the dataspace for the dataset. */
dims[0] = 4;
dims[1] = 6;
dataspace_id = H5Screate_simple(2, dims, NULL);
/* Create the dataset. */
dataset_id = H5Dcreate (file_id, "/dset", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
/* write the dataset */
status = H5Dwrite (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
/* read the dataset */
status = H5Dread (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
/* Close the dataset and dataspace */
status = H5Dclose(dataset_id);
status = H5Sclose(dataspace_id);
status = H5Fclose (file_id);
}
创建group
- 决定将数据存放到哪个 group
- 定义数据特性
- 创建 group.
- 关闭 group
group_id = H5Gcreate (file_id, "MyGroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
status = H5Gclose (group_id);
创建/写入attribute
- Open the object that you wish to add an attribute to.
- Create the attribute
- Write to the attribute
- Close the attribute and the object it is attached to.
hid_t attribute_id, dataspace_id; /* identifiers */
hsize_t dims;
int attr_data[2];
herr_t status;
...
/* Initialize the attribute data. */
attr_data[0] = 100;
attr_data[1] = 200;
/* Create the data space for the attribute. */
dims = 2;
dataspace_id = H5Screate_simple(1, &dims, NULL);
/* Create a dataset attribute. */
attribute_id = H5Acreate2 (dataset_id, "Units", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
/* Write the attribute data. */
status = H5Awrite(attribute_id, H5T_NATIVE_INT, attr_data);
/* Close the attribute. */
status = H5Aclose(attribute_id);
/* Close the dataspace. */
status = H5Sclose(dataspace_id);
以上内容翻自:https://portal.hdfgroup.org/display/HDF5/Introduction+to+HDF5#IntroductiontoHDF5-introprog