HDF5文件格式:数据类型与读写功能详解
HDF5文件格式:数据类型与读写功能详解
HDF5简介
HDF5(Hierarchical Data Format version 5)是一种用于存储和管理大量科学数据的文件格式和库。它由美国国家高级计算应用中心(NCSA)开发,具有以下特点:
- 分层结构(类似文件系统中的目录结构)
- 支持多种数据类型
- 跨平台兼容
- 支持并行I/O
- 提供数据压缩和分块存储
HDF5数据类型
HDF5支持丰富的数据类型,主要分为两类:
1. 基本数据类型
- 整数类型:H5T_STD_I8, H5T_STD_I16, H5T_STD_I32, H5T_STD_I64(有符号)
- 无符号整数:H5T_STD_U8, H5T_STD_U16, H5T_STD_U32, H5T_STD_U64
- 浮点类型:H5T_IEEE_F32, H5T_IEEE_F64
- 字符串类型:定长或变长字符串
- 复合类型:类似C语言中的结构体
- 枚举类型
- 数组类型
- 变长数据类型
2. 派生数据类型
用户可以根据需要创建更复杂的数据类型:
- 复合类型(结构体)
- 数组类型
- 枚举类型
- 变长类型
- 不透明类型
HDF5读写功能
HDF5库提供的主要功能包括:
- 文件操作:创建、打开、关闭文件
- 组操作:创建、遍历组(类似目录)
- 数据集操作:创建、读写数据集(类似多维数组)
- 属性操作:为组或数据集添加元数据
- 数据类型操作:创建和管理数据类型
- 存储管理:分块、压缩、分片存储
HDF5读写示例程序(C语言)
示例1:创建HDF5文件并写入数据集
#include <hdf5.h>
#include <stdio.h>#define FILE_NAME "example.h5"
#define DATASET_NAME "IntArray"
#define DIM0 4
#define DIM1 6int main() {hid_t file_id, dataset_id, dataspace_id;herr_t status;hsize_t dims[2] = {DIM0, DIM1};int data[DIM0][DIM1];// 初始化数据for (int i = 0; i < DIM0; i++)for (int j = 0; j < DIM1; j++)data[i][j] = i * DIM1 + j + 1;// 创建新HDF5文件file_id = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);// 创建数据空间dataspace_id = H5Screate_simple(2, dims, NULL);// 创建数据集dataset_id = H5Dcreate2(file_id, DATASET_NAME, H5T_STD_I32LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);// 写入数据status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);// 关闭资源status = H5Dclose(dataset_id);status = H5Sclose(dataspace_id);status = H5Fclose(file_id);printf("HDF5文件创建成功,数据已写入。\n");return 0;
}
示例2:读取HDF5文件中的数据
#include <hdf5.h>
#include <stdio.h>#define FILE_NAME "example.h5"
#define DATASET_NAME "IntArray"
#define DIM0 4
#define DIM1 6int main() {hid_t file_id, dataset_id;herr_t status;int data[DIM0][DIM1];// 打开现有HDF5文件file_id = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT);// 打开数据集dataset_id = H5Dopen2(file_id, DATASET_NAME, H5P_DEFAULT);// 读取数据status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);// 打印数据printf("读取的数据内容:\n");for (int i = 0; i < DIM0; i++) {for (int j = 0; j < DIM1; j++)printf("%3d ", data[i][j]);printf("\n");}// 关闭资源status = H5Dclose(dataset_id);status = H5Fclose(file_id);return 0;
}
示例3:使用压缩存储和属性
#include <hdf5.h>
#include <stdio.h>
#include <time.h>#define FILE_NAME "compressed.h5"
#define DATASET_NAME "CompressedData"
#define DIM0 1000
#define DIM1 500int main() {hid_t file_id, dataset_id, dataspace_id, plist_id, attr_id, atype_id;herr_t status;hsize_t dims[2] = {DIM0, DIM1};hsize_t chunk_dims[2] = {100, 100};float data[DIM0][DIM1];time_t current_time;char time_str[50];// 初始化数据for (int i = 0; i < DIM0; i++)for (int j = 0; j < DIM1; j++)data[i][j] = (float)(i + j) / (i + j + 1);// 创建新HDF5文件file_id = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);// 创建数据空间dataspace_id = H5Screate_simple(2, dims, NULL);// 创建数据集创建属性列表,启用压缩和分块plist_id = H5Pcreate(H5P_DATASET_CREATE);status = H5Pset_chunk(plist_id, 2, chunk_dims);status = H5Pset_deflate(plist_id, 6); // 设置压缩级别// 创建数据集dataset_id = H5Dcreate2(file_id, DATASET_NAME, H5T_IEEE_F32LE, dataspace_id, H5P_DEFAULT, plist_id, H5P_DEFAULT);// 写入数据status = H5Dwrite(dataset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);// 添加创建时间属性current_time = time(NULL);strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", localtime(¤t_time));atype_id = H5Tcopy(H5T_C_S1);status = H5Tset_size(atype_id, strlen(time_str) + 1);attr_id = H5Acreate2(dataset_id, "CreationTime", atype_id, H5Screate(H5S_SCALAR), H5P_DEFAULT, H5P_DEFAULT);status = H5Awrite(attr_id, atype_id, time_str);// 关闭资源status = H5Aclose(attr_id);status = H5Tclose(atype_id);status = H5Pclose(plist_id);status = H5Dclose(dataset_id);status = H5Sclose(dataspace_id);status = H5Fclose(file_id);printf("压缩的HDF5文件创建成功,数据已写入。\n");return 0;
}
其他语言绑定
HDF5不仅支持C语言,还提供多种语言的API:
- Python:h5py或PyTables库
- C++:HDF5 C++ API
- Java:HDF5 Java绑定
- MATLAB:HDF5接口
- R:rhdf5包
Python示例(使用h5py)
import h5py
import numpy as np# 创建文件并写入数据
with h5py.File('example_py.h5', 'w') as f:data = np.arange(100).reshape(20, 5)dset = f.create_dataset("mydata", data=data)dset.attrs['description'] = "Example dataset created with Python"# 读取数据
with h5py.File('example_py.h5', 'r') as f:data_read = f['mydata'][:]print("Data shape:", data_read.shape)print("Description:", f['mydata'].attrs['description'])
总结
HDF5是一种强大的科学数据存储格式,具有以下优势:
- 支持大型复杂数据集
- 高效的分块和压缩存储
- 丰富的元数据支持(属性)
- 跨平台兼容性
- 多种编程语言支持
通过合理使用HDF5,可以有效地组织、存储和访问大规模科学数据。
相关文章:
HDF5文件格式:数据类型与读写功能详解
HDF5文件格式:数据类型与读写功能详解 HDF5简介 HDF5(Hierarchical Data Format version 5)是一种用于存储和管理大量科学数据的文件格式和库。它由美国国家高级计算应用中心(NCSA)开发,具有以下特点&…...
macOS Chrome - 打开开发者工具,设置 Local storage
文章目录 macOS Chrome - 打开开发者工具设置 Local storage macOS Chrome - 打开开发者工具 方式2:右键点击网页,选择 检查 设置 Local storage 选择要设置的 url,显示右侧面板 双击面板,输入要添加的内容 2025-04-08ÿ…...
使用Vscode排除一些子文件搜索
打开用户/工作区设置 全局生效:打开命令面板(CtrlShiftP 或 CmdShiftP),搜索并选择 Preferences: Open User Settings (JSON)。 仅当前项目生效:在项目根目录下创建 .vscode/settings.json 文件(如果不存在…...
kubernetes 入门篇之架构介绍
经过前段时间的学习和实践,对k8s的架构有了一个大致的理解。 1. k8s 分层架构 架构层级核心组件控制平面层etcd、API Server、Scheduler、Controller Manager工作节点层Kubelet、Kube-proxy、CRI(容器运行时接口)、CNI(网络插件&…...
如何绕过WAF实现SQL注入攻击?
引言 在渗透测试中,SQL注入(SQLi)始终是Web安全的核心漏洞之一。然而,随着企业广泛部署Web应用防火墙(WAF),传统的注入攻击往往会被拦截。本文将分享一种绕过WAF检测的SQL注入技巧…...
如何使用通义灵码完成PHP单元测试 - AI辅助开发教程
一、引言 在软件开发过程中,测试是至关重要的一环。然而,在传统开发中,测试常常被忽略或草草处理,很多时候并非开发人员故意为之,而是缺乏相应的测试思路和方法,不知道如何设计测试用例。随着 AI 技术的飞…...
pig 权限管理开源项目学习
pig 源码 https://github.com/pig-mesh/pig 文档在其中,前端在文档中,官方视频教学也在文档中有。 第一次搭建,建议直接去看单体视频,照着做即可,需 mysql,redis 基础。 文章目录 项目结构Maven 多模块项…...
设计模式:依赖倒转原则 - 依赖抽象,解耦具体实现
一、为什么用依赖倒转原则? 在软件开发中,类与类之间的依赖关系是架构设计中的关键。如果依赖过于紧密,系统的扩展性和维护性将受到限制。为了应对这一挑战,依赖倒转原则(Dependency Inversion Principle,…...
探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并
探秘Transformer系列之(26)— KV Cache优化 之 PD分离or合并 文章目录 探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并0x00 概述0x01 背景知识1.1 自回归&迭代1.2 KV Cache 0x02 静态批处理2.1 调度策略2.2 问题…...
鸿蒙5.0 非桌面页面,设备来电后挂断,自动返回桌面
1.背景 其实在Android上面打开一个应用,然后设备来电后挂断应该是返回到前面打开的这个应用的,但是在鸿蒙里面现象是直接返回桌面,设计如此 2.分析 这个分析需要前置知识,鸿蒙的任务栈页面栈,具体参考如下链接: zh-cn/application-dev/application-models/page-missio…...
C++语言程序设计——02 变量与数据类型
目录 一、变量与数据类型(一)变量的数据类型(二)变量命名规则(三)定义变量(四)变量赋值(五)查看数据类型 二、ASCII码三、进制表示与转换(一&…...
Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server
1.简单介绍 MCP是Model Context Protocol的缩写,是Anthropic开源的一个标准协议。MCP使得大语言模型可以和外部的数据源,工具进行集成。当前MCP在社区逐渐地流行起来了。同时official C# SDK(仓库是csharp-sdk) 也在不断更新中,目前最新版本…...
十四种逻辑器件综合对比——《器件手册--逻辑器件》
目录 逻辑器件 简述 按功能分类 按工艺分类 按电平分类 特殊功能逻辑器件 应用领域 详尽阐述 1 逻辑门 一、基本概念 二、主要类型 三、实现方式 四、应用领域 2 反相器 工作原理 基本功能 主要应用 常见类型 特点 未来发展趋势 3 锁存器 基本概念 工作原理 主要类型…...
将已有 SVN 服务打包成 Docker 镜像的详细步骤
将已有 SVN 服务打包成 Docker 镜像的详细步骤 一、服务器环境准备 在开始将 SVN 服务打包成 Docker 镜像之前,我们需要确保目标服务器的环境满足一定条件。 首先要确保目标服务器已安装 Docker。同时服务器可以连接互联网,可以通过以下简单命令来验证…...
python文件打包无法导入ultralytics模块
💥打包的 .exe 闪退了?别慌!教你逐步排查 PyInstaller 打包的所有错误! 🛠 运行 .exe 查看报错信息✅ 正确姿势: ⚠ importlib 动态导入导致打包失败❓什么是动态导入?✅ 解决方式: …...
AMBA-CHI协议详解(二十六)
AMBA-CHI协议详解(一)- Introduction AMBA-CHI协议详解(二)- Channel fields / Read transactions AMBA-CHI协议详解(三)- Write transactions AMBA-CHI协议详解(四)- Other transactions AMBA-CHI协议详解(五)- Transaction identifier fields AMBA-CHI协议详解(六…...
Go小技巧易错点100例(二十六)
本期分享: 1. string转[]byte是否会发生内存拷贝 2. Go程序获取文件的哈希值 正文: string转[]byte是否会发生内存拷贝 在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在Go中,字…...
FPGA_BD Block Design学习(一)
PS端开发流程详细步骤 1.第一步:打开Vivado软件,创建或打开一个工程。 2.第二步:在Block Design中添加arm核心,并将其配置为IP核。 3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。 …...
ubuntu20.04+qt5.12.8安装serialbus
先从官网https://download.qt.io/archive/qt/5.12/5.12.8/submodules/ 下载 qtserialbus-everywhere-src-5.12.8.tar.xz 有需要其他版本的点击返回上一级自行寻找对应版本。 也可从 https://download.csdn.net/download/zhouhui1982/90595810 下载 在终端中依次输入以下命令…...
银河麒麟V10 Ollama+ShellGPT打造Shell AI助手——筑梦之路
环境说明 1. 操作系统版本: 银河麒麟V10 2. CPU架构:X86 3. Python版本:3.12.9 4. 大模型:mistral:7b-instruct 准备工作 1. 编译安装python 3.12 # 下载python 源码wget https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tg…...
python求π近似值
【问题描述】用公式π/4≈1-1/31/5-1/7..1/(2*N-1).求圆周率PI的近似值。 从键盘输入一个整数N值,利用上述公式计算出π的近似值,然后输出π值,保留小数后8位。 【样例输入】1000 【样例输出】3.14059265 def countpi(N):p0040nowid0for i i…...
基于 Spring Boot + Vue 的 [业务场景] 管理系统设计与实现
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
如何查看自己抖音的IP属地?详细教程+常见问题解答
在当今互联网时代,IP属地信息已成为各大社交平台(如抖音、微博、快手等)展示用户真实网络位置的重要功能。无论是出于隐私保护、账号安全,还是单纯好奇自己的IP归属地,了解如何查看抖音IP属地都很有必要。 本文将详细介…...
⑪数据中心网络M-LAG实战
一、DeviceA-M-LAG-Mater配置 1、M-LAG 系统配置。 # m-lag mad exclude interface GigabitEthernet1/0/7 m-lag mad exclude interface Vlan-interface100 m-lag mad exclude interface Vlan-interface101 m-lag system-mac 0002-0002-0002 m-lag system-number 1 m-la…...
化工企业数字化转型:从数据贯通到生态重构的实践路径
一、战略定位:破解行业核心痛点 化工行业面临生产安全风险高(全国危化品企业事故率年增5%)、能耗与排放压力大(占工业总能耗12%)、供应链协同低效(库存周转率低于制造业均值30%)三大挑战。《石…...
JAVA——初识JAVA
文章目录 如何在cmd上编译、运行代码解析String[] args中放的是什么Java结构编译运行可能遇到的错误Java中的注释Java的三种注释编码不一致的问题 IDEA常用基础开发快捷键补齐快捷键注释快捷键 IDEA的基础调式方法标识符 如何在cmd上编译、运行 在没有集成开发环境下ÿ…...
Shell脚本的学习
编写脚本文件 定义以开头:#!/bin/bash #!用来声明脚本由什么shell解释,否则使用默认shel 第一步:编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步:加上执行权限:chmod x 脚本文件名.sh 第三步&…...
专题十四:动态路由——OSPF
一、OSPF简介 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol),采用DIjkstra算法,协议号是89。用于自治系统(A…...
聊聊Spring AI的Multimodality
序 本文主要研究一下Spring AI的Multimodality 示例 chatModel示例 var imageResource new ClassPathResource("/multimodal.test.png");var userMessage new UserMessage("Explain what do you see in this picture?", // contentnew Media(MimeTy…...
区块链点燃游戏行业新未来——技术变革与实践指南
区块链点燃游戏行业新未来——技术变革与实践指南 在数字时代,游戏行业无疑是创新的热土。从简单像素风的街机游戏到沉浸式的虚拟现实,我们见证了技术如何一步步塑造游戏的样貌。然而,在传统游戏模式中,玩家权益往往无法得到保障…...
