现在我正在使用HDF5 C ++接口将条目写入具有无限长度的1d数据集。这些条目一次生成一个,但为了最大限度地减少对磁盘的写入,我会累积一个条目数组,然后在数组大小达到某个阈值时将它们以块的形式写入磁盘。这会带来显着的性能提升,但会使代码变得非常复杂。
我最近了解了数据包表接口,这可能会简化事情,但真正的好处是,如果它在写入磁盘之前缓冲数据。我无法从文档中告诉Packet Tables是否这样做,有人知道答案吗?
答案 0 :(得分:1)
自己缓冲数据要比直接写入数据包表快得多。
看一下实现(版本1.8.17和1.10.0-patch1),结果是对H5PTappend
的单个调用有很多工作要做,以便编写数据:
H5Dwrite
,其中有很多工作要做?如果您逐个编写小数据包(如单个数字值),这些工作将比花在将数据写入磁盘的时间花费更多时间。
因此,在这种情况下缓冲数据会更好,但数据包表API仍然可以更轻松地创建无限长度的1d数据集。在找出性能不佳的原因后,这就是我使用数据包表的原因。
答案 1 :(得分:0)
你不必费心去做缓冲。 H5::DataSet::write
(以及基础H5Dwrite
)默认是缓冲的。对于特殊需求,您可以使用数据集传输属性列表控制缓冲区大小,但默认值通常可以很好地工作。
我不熟悉Packet Table,但由于它是基于低级别的高级接口,因此很可能也会缓冲写入。