具有版本控制的 HDF5 文件 (h5py) - 每次保存时都会更改哈希

Posted

技术标签:

【中文标题】具有版本控制的 HDF5 文件 (h5py) - 每次保存时都会更改哈希【英文标题】:HDF5 file (h5py) with version control - hash changes on every save 【发布时间】:2013-04-07 19:57:33 【问题描述】:

我正在使用 h5py 将来自数值工作的中间数据存储在 HDF5 文件中。我将项目置于版本控制之下,但这不适用于 HDF5 文件,因为每次重新运行生成 HDF5 文件的脚本时,即使其中的数据没有,二进制文件也会更改。

这里有一个小例子来说明这一点:

In [1]: import h5py, numpy as np

In [2]: A = np.arange(5)

In [3]: f = h5py.File('test.h5', 'w'); f['A'] = A; f.close()

In [4]: !md5sum test.h5
7d27c258d94ed5d06736f6d2ba7c9433  test.h5

In [5]: f = h5py.File('test.h5', 'w'); f['A'] = A; f.close()

In [6]: !md5sum test.h5
c1db5806f1393f2095c88dbb7efeb7d3  test.h5

In [7]: # the file has changed but still contains the same data!

我查看了 HDF5 文件格式文档和 h5py 文档,但没有找到任何对我有帮助的东西。我的问题是:

    为什么即使我保存相同的数据文件也会更改?

    我怎样才能阻止它发生变化,所以版本控制只会在实际数字内容发生变化时看到文件的新版本?

谢谢

【问题讨论】:

这意味着涉及时间戳 我同意时间戳似乎很可能,但我在文件中找不到时间戳(在 Python 中使用 h5py,或使用命令行工具 h5lsh5dump 【参考方案1】:

HDF5 文件同时使用抽象数据模型和抽象存储模型。这意味着文件在磁盘上的存储方式可能(并且通常是)完全不同于它在程序中的表示方式。可以以多种方式存储完全相同的数据,而这对您的程序来说并不明显。

HDF5 file format storage specification 允许在数据对象标头中使用多个时间戳。这些不作为属性存储,因此通常不能被高级 API 访问。 可以使用低级 HDF5 API 关闭写入这些时间戳,但不清楚相关功能是否在 h5py 中。 This github issue 似乎正是您想要的,但不幸的是它仍然是开放的。

【讨论】:

谢谢,这就解释了! 如果 h5py 无法使用,您可以使用 C(或 Fortran 或 Java)的低级 API 来关闭时间戳。 几年后...看起来这已经合并了,您现在可以将track_times=False 传递给create_dataset 以获得可重复性。 几年后再次...使用h5py 3.5,track_times=False 现在是默认设置。

以上是关于具有版本控制的 HDF5 文件 (h5py) - 每次保存时都会更改哈希的主要内容,如果未能解决你的问题,请参考以下文章

用 h5py 创建的 HDF5 文件不能被 h5py 打开

如何区分 HDF5 数据集和使用 h5py 的组?

判断使用 h5py 创建的 HDF5 文件是不是被压缩

使用 h5py 删除 hdf5 数据集

使用 h5py 将光栅图像添加到 HDF5 文件

Pandas 无法读取使用 h5py 创建的 hdf5 文件