精细控制 h5py 缓冲

Fine control over h5py buffering

我在内存中有一些数据要存储在 HDF 文件中。

我的数据不是很大(<100 MB,所以它们很适合放在内存中),所以为了性能,将它们保留在那里似乎是有意义的。同时,我也想把它存储在磁盘上。两者始终完全同步并不重要,只要它们都有效(即未损坏),并且我可以手动触发同步。

我可以将数据保存在内存中的单独容器中,然后按需将其放入 HDF 对象中。如果可能的话,我想避免写这一层。这将需要我跟踪哪些部分已更改,并有选择地更新这些部分。我希望 HDF 能帮我解决这个问题。

我知道 driver='core' 具有后备存储功能,但据我所知,它仅在 关闭 文件时同步后备存储。 我可以 flush 文件,但这能保证将对象写入存储吗?

从HDF5源码来看,答案似乎是肯定的。但我想听听确认。

额外问题:driver='core' 实际上比普通文件系统后端更快吗?我需要注意什么?

H5Fflush命令的作用是请求文件系统将所有缓冲区传输到文件。

documentation 对此有具体说明:

HDF5 does not possess full control over buffering. H5Fflush flushes the internal HDF5 buffers then asks the operating system (the OS) to flush the system buffers for the open files. After that, the OS is responsible for ensuring that the data is actually flushed to disk.

在实践中,我注意到我可以使用大部分时间从已刷新的 HDF5 文件中读取数据(即使该进程随后被终止)但是 HDF5 不能保证这一点:没有依靠刷新操作来获得有效的 HDF5 文件的安全性,因为进一步的操作(例如,在元数据上)可能会损坏文件,然后进程会被中断。您必须完全关闭文件才能保持这种一致性。

如果您需要一致性并避免损坏的 hdf5 文件,您可能喜欢:

1) 使用write-ahead-log,每次都用append logs写added/updated,暂时不用写hdf5了。 2)周期性地,或者在你需要关机的时候,你重放日志来一个一个地应用它们,写入hdf5文件 3)如果你的进程在1)期间宕机,你不会丢失数据,下次启动后,只需重放日志并将它们写入hdf5文件 4) 如果您的进程在 2) 期间宕机,您不会丢失数据,只需删除损坏的 hdf5 文件,重放日志并重新写入。