我正在使用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文档,但没有找到任何可以帮助我解决这个问题。我的问题是:
为什么即使我保存相同的数据,文件也会改变?
如何停止更改,因此版本控制仅在实际数字内容发生变化时才会看到新版本的文件?
由于
答案 0 :(得分:2)
HDF5文件既使用抽象数据模型,也使用抽象存储模型。这意味着文件如何存储在磁盘上可能(通常是)与程序中的文件表示方式完全不同。可以以多种方式存储完全相同的数据,并且这对您的程序来说并不明显。
HDF5 file format storage specification允许数据对象标头中有多个时间戳。它们不作为属性存储,因此通常不能由高级API访问。 可以使用低级别HDF5 API关闭写入这些时间戳,但不清楚相关功能是否在h5py中。 This github issue似乎正是您想要的,但不幸的是它仍然是开放的。