【问题标题】:Fine control over h5py buffering对 h5py 缓冲的精细控制
【发布时间】:2018-07-09 02:58:26
【问题描述】:

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

我的数据并不大(始终完全同步并不重要,只要它们都有效(即没有损坏),并且我可以手动触发同步。

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

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

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

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

【问题讨论】:

  • 你试过了吗?
  • 简单地说。我添加了一个数据集,我调用了flush,大约一秒钟后,操作系统告诉我文件大小增加了。

标签: python hdf5 h5py


【解决方案1】:

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

1) 使用 write-ahead-log,每次都使用 append log 写入正在添加/更新的内容,此时无需写入 hdf5。 2)定期,或者在需要关机的时候,重放日志,一一应用,写入hdf5文件 3)如果您的进程在1)期间停止,您不会丢失数据,下次启动后,只需重播日志并将它们写入hdf5文件 4)如果您的进程在2)期间宕机,您不会丢失数据,只需删除损坏的hdf5文件,重播日志并重新写入即可。

【讨论】:

    【解决方案2】:

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

    documentation 对此有具体说明:

    HDF5 不能完全控制缓冲。 H5Fflush 冲洗 内部 HDF5 缓冲区然后要求操作系统(操作系统) 刷新打开文件的系统缓冲区。之后,操作系统是 负责确保数据实际刷新到磁盘。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2012-07-30
      • 2013-07-27
      相关资源
      最近更新 更多