在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,我不太熟悉它们是否提供解决方案。
通过高延迟、高带宽网络连接读取数据流的关键是减少对文件 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.
我们可以访问一个数 GB 的 HDF5 文件,因为它是在几分钟内编写的。我们希望在可用时(亚秒级时间范围)提取写入文件的最新数据。
有什么方法可以在写入时将 HDF5 文件作为字节流读取吗?
我看到这个问题 (Read HDF5 in streaming in java) w.r.t。 Java 这似乎表明使用较低级别的 HDF5 工具可以进行流式传输,但不在那个特定的 java 包中。
特别注意 H5PY python 包有一组低级 API,我不太熟悉它们是否提供解决方案。
通过高延迟、高带宽网络连接读取数据流的关键是减少对文件 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.