我在内存中有一些数据要存储在HDF文件中。
我的数据不是很大(<100 MB,所以它们非常适合内存),所以对于性能来说,保持它们似乎是有意义的。同时,我也想将它存储在磁盘上。两个总是完全同步并不重要,只要它们都有效(即没有损坏),并且我可以手动触发同步。
我可以将我的数据保存在内存中的单独容器中,并根据需要将其铲入HDF对象。如果可能的话我想避免写这个图层。这需要我跟踪哪些部分已被更改,并有选择地更新这些部分。我希望HDF会照顾我。
我知道具有后备存储功能的driver='core'
,但它是AFAICT,它只在关闭文件时同步后备存储。 我可以flush
该文件,但是这样可以保证将对象写入存储吗?
从查看HDF5源代码,似乎答案是肯定的。但是我想听听确认。
加分问题:driver='core'
实际上比普通文件系统后端更快吗?我需要注意什么?
答案 0 :(得分:1)
H5Fflush
命令对文件系统执行请求以将所有缓冲区传输到文件。
documentation有一个特别说明:
HDF5无法完全控制缓冲。 H5Fflush冲洗 然后内部HDF5缓冲区要求操作系统(OS) 刷新打开文件的系统缓冲区。之后,操作系统就是 负责确保数据实际刷新到磁盘。
在实践中,我注意到我可以使用大部分时间从已刷新的HDF5文件中读取数据(即使该进程随后被杀死)但HDF5无法保证这一点:没有安全性依赖于刷新操作来获得有效的HDF5文件,因为进一步的操作(例如,在元数据上)可能会破坏文件,然后进程被中断。您必须完全关闭文件才能保持这种一致性。
答案 1 :(得分:0)
如果您需要一致性并避免损坏的hdf5文件,您可能希望:
1)使用write-ahead-log,使用追加日志写入每次添加/更新的内容,此时无需写入hdf5。 2)定期或在您需要关闭时重放日志以逐个应用它们,写入hdf5文件 3)如果您的进程在1)期间停机,您将不会丢失数据,下次启动后,只需重播日志并将其写入hdf5文件 4)如果您的进程在2)期间关闭,您将不会丢失数据,只需删除损坏的hdf5文件,重播日志并再次写入。