技术背景

在前面的一篇博客中,我们介绍过使用VMD可视化H5MD标准化格式的轨迹文件的方法。H5MD本质上就是一个有规范格式的hdf5二进制文件,本文主要介绍两个关于hdf5的内容更新操作。

写入和更新数据

我们通常使用到的一个功能就是,通过h5py.File函数来打开或者创建一个hdf5文件,然后用create_dataset在文件中创建表单,再持续的向表单中填写数据。那么如果要更新文件中的数据怎么办呢?操作逻辑是比较简单的,直接加载对应的表单并获取返回值,然后直接在返回值中更新数据内容即可。如下是一个代码示例:

import h5py
import numpy as np
import os h5_name = 'example.h5'
if os.path.exists(h5_name):
with h5py.File('example.h5', 'r+') as file:
dataset = file['my_dataset']
new_data = np.random.rand(dataset.shape[0])
dataset[...] = new_data else:
# 创建一个新的HDF5文件
with h5py.File(h5_name, 'w') as f:
dset = f.create_dataset("my_dataset", (10,), dtype='f')
data = np.arange(10)
dset[...] = data

这个代码分成了两个部分,如果在指定的目录下不存在这个hdf5文件,我们就首先创建一个hdf5文件,表单内容为1~10的数字(这里使用了一个VSCode中的插件加H5Web来对h5文件进行可视化):

如果在路径下已经存在对应的h5文件,则修改其中的表单内容。例如我们把上述的测试代码执行两次,那么我们得到的h5文件内容是这样的:

刷新文件

hdf5文件作为一个规范格式的二进制文件,有严格的完整性校验。那么就会产生一个问题,如果在写入的过程中进程被中断,那么这个hdf5文件就会损坏:

当然,如果是Ctrl+C手动停止进程,那我们是可以参考这篇博客的内容进行终止信号的监听和管理的。但问题是如果被系统kill -9强行终止,是没办法捕获相关信号的。所以这里有一个方案,是通过flush,对中间过程进行保存,案例如下:

import h5py
import numpy as np
import time h5_name = 'example.h5'
# 创建一个新的HDF5文件
with h5py.File(h5_name, 'w') as f:
dset = f.create_dataset("my_dataset", (10,), dtype='f')
data = np.arange(10)
dset[...] = data
new_data = np.random.rand(dset.shape[0])
f.flush()
time.sleep(30)
dset[...] = new_data

这个案例中我们sleep了30秒的时间,在这个期间内我们会在系统中kill -9把这个Python进程杀死。如果没有加上f.flush()这一行,就会出现上面那张图中的报错,意味着这个hdf5文件是损坏的。如果加上了这一行代码,那效果如下:

这里需要说明的是,hdf5文件损坏只会出现在第一次写入hdf5文件的时候。如果使用第一个章节中的r+模式进行二次写入,不会有文件损坏的问题。

总结概要

hdf5是一个在量子化学和分子动力学模拟中经常有可能被用到的一种数据存储格式,得益于其良好的压缩率和完整性校验,一定程度上保障了其数据/轨迹存储的可靠性。本文介绍了关于hdf5文件的两个操作:更新已有的hdf5文件中的数据内容,以及flush同步更新的方法。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/h5py-update.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

参考文章

  1. https://arxiv.org/abs/1308.6382

h5py文件写入之——flush和update的更多相关文章

  1. Java文件写入,换行

    import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOExce ...

  2. Python-将json文件写入ES数据库

    1.安装Elasticsearch数据库 PS:在此之前需首先安装Java SE环境 下载elasticsearch-6.5.2版本,进入/elasticsearch-6.5.2/bin目录,双击执行 ...

  3. Java文件写入与读取实例求最大子数组

    出现bug的点:输入数组无限大: 输入的整数,量大: 解决方案:向文件中输入随机数组,大小范围与量都可以控制. 源代码: import java.io.BufferedReader; import j ...

  4. AspectJWeaver文件写入gadget详解和两种应用场景举例

    目录 0 前言 1 环境 2 gadget解析 2.1 高版本Commons-Collections的防御措施 2.2 获取AspectJWeaver的调用链 2.3 gadget详解 3 两种应用场 ...

  5. 视频文件写入转换之图像处理-OpenCV应用学习笔记五

    在<笔记二>中我们做了视频播放和控制的实现,仅仅算是完成了对视频文件的读取操作:今天我们来一起练习下对视频文件的写入操作:格式转换. 实现功能: 打开一个视频文件play.avi,读取文件 ...

  6. Python学习笔记——文件写入和读取

    1.文件写入 #coding:utf-8 #!/usr/bin/env python 'makeTextPyhton.py -- create text file' import os ls = os ...

  7. Sqli-LABS通关笔录-7[文件写入函数Outfile]

    该关卡最主要的就是想要我们学习到Outfile函数(文件写入函数)的使用. 通过源代码我们很容易的写出了payload.倘若我们一个个去尝试的话,说实话,不容易. http://127.0.0.1/s ...

  8. 将gridFS中的图片文件写入硬盘

    开启用户验证下的gridfs 连接使用,在执行脚本前可以在python shell中 from pymongo import Connectionfrom gridfs import *con = C ...

  9. PHP文件读写操作之文件写入代码

    在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...

  10. Java学习-018-EXCEL 文件写入实例源代码

    众所周知,EXCEL 也是软件测试开发过程中,常用的数据文件导入导出时的类型文件之一,此文主要讲述如何通过 EXCEL 文件中 Sheet 的索引(index)或者 Sheet 名称获取文件中对应 S ...

随机推荐

  1. NOIP模拟81

    T1 语言 解题思路 模拟即可,对于一个合法的句子直接判断每一个前缀和每一个后缀是否是合法的名词词组. 然后枚举动词的位置判断前后两段是否合法就好了. code #include<bits/st ...

  2. .Net Core 部署IIS

    我相信很多人看了其他的贴子,都没有成功部署,因为里面有很多暗坑.接下来博主就一步一步给大家讲明白,带领大家部署 先基本的发布 操作:右击web项目的<发布>按钮.选文件 配置发布属性    ...

  3. echarts做饼图

    今天记录下echarts做饼图 父组件 <el-card style="height:600px ;margin-top:20px" v-loading="card ...

  4. jquery的树状菜单

    <body>     <ul>         <li>一级菜单                 <ol>                 <li ...

  5. ES 数据太敏感不让看,怎么办?

    在使用 ES 的过程中,如果 ES 集群中存放的是敏感数据,是不能够随便供人查看的.什么?在排查故障?那也不行,合规高于一切. 不知道大家有没有遇到过上面描述的情景,或者如果是你遇到了,你会怎么办呢? ...

  6. SRE Google 运维解密读书笔记一:SRE 方法论概述

    SRE Google 运维解密,是 SRE 领域的启蒙之作,讲述了 Google 的 SRE 实践,SRE 就是从 Google 流传出来的.本文是读书笔记,第一篇,概述 SRE 方法论.帮大家把书读 ...

  7. UITableView的使用样例(简易向)

    功能实现 构建一个UITableView,并使其默认显示a,b,c--.. 构建一个按钮,点击后列表变为英文字母 构建一个按钮,点击后列表变为数字 基本概念 实现前头文件需要签订协议(如何签订向后看) ...

  8. Vite-Wechat网页聊天室|vite5.x+vue3+pinia+element-plus仿微信客户端

    基于Vue3+Pinia+ElementPlus仿微信网页聊天模板Vite5-Vue3-Wechat. vite-wechat使用最新前端技术vite5+vue3+vue-router@4+pinia ...

  9. FEDORA 显卡驱动安装

    FEDORA 显卡驱动安装 在fedora中akmod-nvidia包可以自动的处理开源驱动屏蔽等各种问题, 强烈推荐用这个安显卡驱动. -1. 在 BIOS 中关闭安全启动 0. 切换桌面环境至 X ...

  10. hive第二课:Hive3.1.2分区与排序以及分桶(内置函数)

    Hive3.1.2分区与排序(内置函数) 1.Hive分区(十分重要!!) 分区的目的:避免全表扫描,加快查询速度! 在大数据中,最常见的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件 ...