HDF5 介绍
HDF5介绍
HDF 是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要。HDF 可以表示出科学数据存储和分布的许多必要条件。HDF 被设计为:
- 自述性:对于一个HDF 文件里的每一个数据对象,有关于该数据的综合信息(元数据)。在没有任何外部信息的情况下,HDF 允许应用程序解释HDF文件的结构和内容。
- 通用性:许多数据类型都可以被嵌入在一个HDF文件里。例如,通过使用合适的HDF 数据结构,符号、数字和图形数据可以同时存储在一个HDF 文件里。
- 灵活性:HDF允许用户把相关的数据对象组合在一起,放到一个分层结构中,向数据对象添加描述和标签。它还允许用户把科学数据放到多个HDF 文件里。
- 扩展性:HDF极易容纳将来新增加的数据模式,容易与其他标准格式兼容。
- 跨平台性:HDF 是一个与平台无关的文件格式。HDF 文件无需任何转换就可以在不同平台上使用。
(官方介绍:https://support.hdfgroup.org/HDF5/whatishdf5.html)
HDF5 结构
HDF5
文件一般以.h5
或者.hdf5
作为后缀名,需要专门的软件才能打开预览文件的内容。
HDF5
文件结构中有2 primary objects: Groups
和 Datasets
。
- Groups就类似于文件夹,每个
HDF5
文件其实就是根目录 **(root) group’/‘**。 - Datasets类似于NumPy中的数组 array 。
每个 dataset 可以分成两部分: 原始数据 (raw) data values 和 元数据 metadata (a set of data that describes and gives information about other data => raw data)。
+-- Dataset
| +-- (Raw) Data Values (eg: a 4 x 5 x 6 matrix)
| +-- Metadata
| | +-- Dataspace (eg: Rank = 3, Dimensions = {4, 5, 6})
| | +-- Datatype (eg: Integer)
| | +-- Properties (eg: Chuncked, Compressed)
| | +-- Attributes (eg: attr1 = 32.4, attr2 = "hello", ...)
|
从上面的结构中可以看出:
- Dataspace 给出原始数据的秩 (Rank) 和维度 (dimension)
- Datatype 给出数据类型
- Properties 说明该 dataset 的分块储存以及压缩情况
- Chunked: Better access time for subsets; extendible
- Chunked & Compressed: Improves storage efficiency, transmission speed
- Attributes 为该 dataset 的其他自定义属性
整个HDF5
文件的结构如下所示:
+-- /
| +-- group_1
| | +-- dataset_1_1
| | | +-- attribute_1_1_1
| | | +-- attribute_1_1_2
| | | +-- ...
| | |
| | +-- dataset_1_2
| | | +-- attribute_1_2_1
| | | +-- attribute_1_2_2
| | | +-- ...
| | |
| | +-- ...
| |
| +-- group_2
| | +-- dataset_2_1
| | | +-- attribute_2_1_1
| | | +-- attribute_2_1_2
| | | +-- ...
| | |
| | +-- dataset_2_2
| | | +-- attribute_2_2_1
| | | +-- attribute_2_2_2
| | | +-- ...
| | |
| | +-- ...
| |
| +-- ...
|
Python 读写 HDF5 文件
HDF5
的python库h5py
调用:
import h5py
import numpy as np
# 保存数据为 HDF5 文件
with h5py.File('../out/compressed_data.h5', 'w') as f:
# 创建一个数据集,并使用 gzip 压缩
dset = f.create_dataset('data', data=data, compression='gzip', compression_opts=9)
# 打印数据
print(data)
c# 读取 HDF5 文件
https://apollo3zehn.github.io/PureHDF/reading/index.html
using System;
using PureHDF;
class Program
{
static void Main(string[] args)
{
// 打开 HDF5 文件
using (var file = Hdf5.OpenFile("compressed_data.h5"))
{
// 打开数据集
using (var dataset = file.OpenDataset("data"))
{
// 获取数据集的维度
var dims = dataset.Dimensions;
Console.WriteLine($"Data shape: ({string.Join(", ", dims)})");
// 读取数据
float[,,,] data = new float[dims[0], dims[1], dims[2], dims[3]];
dataset.Read(data);
// 使用数据...
// 例如,打印第一个元素
Console.WriteLine($"First element: {data[0, 0, 0, 0]}");
}
}
}
}