具有版本控制的 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
,或使用命令行工具 h5ls
和 h5dump
)
【参考方案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) - 每次保存时都会更改哈希的主要内容,如果未能解决你的问题,请参考以下文章