【问题标题】:Can HDF5 data be read as a byte stream in real time in Python?HDF5数据可以在Python中实时读取为字节流吗?
【发布时间】:2021-08-03 06:30:32
【问题描述】:

我们可以访问数千兆字节的 HDF5 文件,因为它是在几分钟内写入的。我们希望在文件可用时提取写入文件的最新数据(次秒时间范围)。

有没有办法在写入时将 HDF5 文件作为字节流读取?

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

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

https://api.h5py.org/

【问题讨论】:

  • 在 StackOverflow 上请求软件或库是题外话
  • 我不是要软件库。我在问是否可以以实时流的方式读取 HDF5 格式。特别是在 Python 环境中。但是在任何环境中的答案也是有用的。
  • 实际上,答案是“否”。 HDF5 有点类似于带有子目录和文件的迷你文件系统。在文件完成之前不会修复目录。
  • 不可能吗?不,这不是不可能的。今天实用吗?不,只是没有。
  • @David Parks,我会与开发人员核实:HDF 组是询问同时访问文件的能力的最佳来源。他们有一个论坛,有一个 h5py 特定频道。

标签: python hdf5 h5py


【解决方案1】:

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

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

What is the block size in HDF5?

当从 python 对象读取数据时(如果您有一个网络访问的文件,这很典型),任何对数据的访问都会导致大约六次小标题读取,然后每个读取的数据将是 1 read(n)用户块大小。对read(n) 的调用(不幸的是)是连续的,因此许多小型读取在网络上会很慢。因此,将块大小设置为适合您的用例的合理值将减少 read(n) 调用的数量。

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

如果您的数据没有为您的目的而有效地打包,您可以使用h5repack 重新打包它(一个缓慢的一次性过程,不会更改数据,只是打包顺序)。

【讨论】:

    【解决方案2】:

    我认为 HDF5 SWMR(单写/多读)可以满足您的要求。 user guide 描述了它的工作原理,现在h5py with examples 提供了支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2018-07-28
      • 2020-03-21
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多