在Python中能否将HDF5数据实时读取为字节流?

Can HDF5 data be read as a byte stream in real time in Python?

我们可以访问一个数 GB 的 HDF5 文件,因为它是在几分钟内编写的。我们希望在可用时(亚秒级时间范围)提取写入文件的最新数据。

有什么方法可以在写入时将 HDF5 文件作为字节流读取吗?

我看到这个问题 (Read HDF5 in streaming in java) w.r.t。 Java 这似乎表明使用较低级别的 HDF5 工具可以进行流式传输,但不在那个特定的 java 包中。

特别注意 H5PY python 包有一组低级 API,我不太熟悉它们是否提供解决方案。

https://api.h5py.org/

通过高延迟、高带宽网络连接读取数据流的关键是减少对文件 read(n) 的调用次数,这些调用是连续的。 HDF5 有一个称为 User Block Size 的功能,它是在使用 h5repack 工具创建或重置文件时设置的。

下面的 SO 文章中描述了用户块大小。在这里总结一下,数据存储在用户指定维度的块中。例如,形状为 1Mx128 的 table 可能具有 10kx1 的块大小,它将以 10k 块(1 列)的形式存储数据。

What is the block size in HDF5?

从 python object 读取数据时(这是典型的网络访问文件),对数据的任何访问都会导致大约六个小 header读取,则数据读取将为每个用户块大小 1 read(n)。对 read(n) 的调用是(不幸的)顺序的,因此许多小的读取在网络上会很慢。因此,将块大小设置为适合您的用例的合理值将减少 read(n) 调用的次数。

请注意,这里通常需要权衡取舍。将块大小设置为 10kx128 会强制读取所有 128 列,您不能只读取该块大小的 1 列。但是将块大小设置为 10kx1 意味着读取所有 128 个通道将导致每 10k 行调用 128 read(n) 次。

如果您的数据没有根据您的目的有效打包,您可以使用 h5repack.

我认为您所要求的可以通过 HDF5 SWMR (Single-Writer/Multiple-Reader) 实现。 user guide describes how it works, and there is now support in h5py with examples.