【问题标题】:Storing datastream in hdf5 file using python使用python将数据流存储在hdf5文件中
【发布时间】:2021-06-20 04:47:55
【问题描述】:

我有一个 python 程序,它通过 UDP 以 +- 1000 Hz 的速率接受数据流。一个典型的流需要 +- 15 分钟。 它由 +- 10 个通道组成,每个通道由双精度流、布尔值或大小为 3 的带有时间戳的向量组成。

目前每次迭代(每秒 1000 次)它都会将一行写入包含所有值的 csv 文件。

为了限制文件的大小,我想将格式更改为 hdf5 并使用 h5py 写入数据。

非常短,应该是这样的:

class StoreData(threading.Thread):

    def __init__(self):
        super().__init__()
        self.f = open_hdf5_file_as_write()

    def run(self):
        while True:
            # return True every +- 0.001 seconds
            if self.new_values_available():
                vals = self.get_new_vals()
                # What to do best with the vals here?

但我偶然发现了 2 个问题。

  1. HDF5 文件的最佳结构是什么?最好将流存储在不同的组中,还是将不同的数据集存储在同一组中?

  2. 我应该如何写数据?我是否使用调整大小来扩展具有 1 个变量的数据集的每次迭代?我是在本地存储数据并在每 n 次迭代中更新每个流的 n 个值,还是将所有内容保存在 pandas 表中并在最后只写入一次?

回答 2 个问题中的 1 个已经很有帮助了!

【问题讨论】:

    标签: python hdf5 h5py


    【解决方案1】:

    两个都是好问题。如果不了解您的数据和工作流程,我无法给出准确的答案。 (注意:HDF 小组 有一个很好的概述,您可能想在这里查看:Introduction to HDF5。这是一个学习模式设计可能性的好地方。)以下是我会考虑的事情“思想实验”:

    最佳结构:
    使用 HDF5,您可以定义任何您想要的架构(在限制范围内),因此最佳结构(架构)是最适合您的数据和流程的架构。

    • 由于您有一个现有的 CSV 文件格式,最简单的方法是创建一个等效的 NumPy dtype,并引用它来创建一个保存数据的recarray。这将模仿您当前的数据组织。如果您想变得更漂亮,还有其他注意事项:
    • 您的数据类型:它们是同质的(所有浮点数或所有整数)还是异构的(浮点数、整数和字符串的混合)?如果它们都相同,您将有更多选择。不过,HDF5 也支持混合类型作为复合数据。
    • 组织:您将如何使用这些数据?正确设计的模式将帮助您在未来避免数据体操。将所有内容保存在 1 个数据集中或分布在不同的数据集/组中是否有利(对您)?想想在您计算机上的文件夹和文件中组织的数据。 HDF5 组是您的文件夹,数据集是您的文件。
    • 使用数据的便利性:类似于组织。写与读的难易程度。当你得到它时写它可能更容易 - 但是当你想要处理它时这是一种方便的格式吗?

    我应该如何写数据?
    有几个 Python 包可以写入 HDF5 数据。我熟悉 PyTables(又名表)和 h5py。 (Pandas 也可以创建 HDF5 文件,但我没有经验可分享。)两个包的功能相似,但也有一些差异。两者都支持您需要的 HDF5 功能(可调整大小的数据集、同质和/或异构数据)。 h5py 尝试将 HDF5 功能集尽可能接近地映射到 NumPy。 PyTables 在 HDF5 和 NumPy 之上有一个抽象层,具有高级索引功能,可以快速执行内核数据查询。 (另外,我发现 PyTables I/O 比 h5py 稍快。)出于这些原因,我更喜欢 PyTables,但我对 h5py 也同样满意。

    我应该多久写一次:每 1 或 N 次迭代,还是最后一次?
    这是可用 RAM 与所需 I/O 性能与编码复杂性之间的权衡。每次写入文件都会产生 I/O“时间成本”。因此,最快的过程是将所有数据保存在 RAM 中并在最后写入。这意味着您需要足够的内存来保存 15 分钟的数据流。我怀疑内存需求会推动这个决定。好消息:PyTables 和 h5py 将支持这些方法中的任何一种。

    【讨论】:

      猜你喜欢
      • 2015-03-03
      • 2017-01-08
      • 1970-01-01
      • 2019-10-03
      • 2018-02-22
      • 2015-09-18
      • 1970-01-01
      • 2011-05-07
      • 2019-12-12
      相关资源
      最近更新 更多