簡體   English   中英

使用 python 將數據流存儲在 hdf5 文件中

[英]Storing datastream in hdf5 file using python

我有一個 python 程序,它通過 UDP 以 +- 1000 Hz 的速率接受 stream 數據。 典型的 stream 需要 +- 15 分鍾。 它由 +- 10 個通道組成,每個通道由一個 stream 組成,該通道由雙精度數、布爾值或大小為 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?

但我偶然發現了兩個問題。

  1. HDF5 文件的最佳結構是什么? 最好將流存儲在不同的組中,還是將不同的數據集存儲在同一組中?

  2. 我應該如何寫數據? 我是否使用調整大小來擴展具有 1 個變量的數據集的每次迭代? 我是在本地存儲數據並使用每個 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 的 n 值塊更新每 n 次迭代,還是將所有內容保存在 pandas 表中並在最后只寫入一次?

回答 2 個問題中的 1 個已經很有幫助了!

兩個都是好問題。 如果不了解您的數據和工作流程,我無法給出准確的答案。 (注意: HDF 小組有一個很好的概述,您可能想在這里查看: HDF5 簡介。這是學習模式設計可能性的好地方。)以下是我在“思想實驗”中會考慮的事情:

最佳結構:
使用 HDF5,您可以定義任何您想要的架構(在限制范圍內),因此最佳結構(架構)是最適合您的數據和流程的架構。

  • 由於您有一個現有的 CSV 文件格式,最簡單的方法是創建一個等效的 NumPy dtype,並引用它來創建一個包含數據的recarray。 這將模仿您當前的數據組織。 如果你想變得更漂亮,這里有其他注意事項:
  • 您的數據類型:它們是同質的(所有浮點數或所有整數)還是異構的(浮點數、整數和字符串的混合)? 如果它們都相同,您將有更多選擇。 但是,HDF5 也支持混合類型作為復合數據。
  • 組織:您將如何使用這些數據? 正確設計的模式將幫助您在未來避免數據體操。 將所有內容保存在 1 個數據集中或分布在不同的數據集/組中是否有利(對您)? 想想在您計算機上的文件夾和文件中組織的數據。 HDF5 組是您的文件夾,數據集是您的文件。
  • 使用數據的便利性:類似於組織。 寫與讀的難易程度。 當你得到它時編寫它可能更容易 - 但是當你想要處理它時這是一種方便的格式嗎?

我應該如何寫數據?
有幾個Python包可以寫HDF5數據。 我熟悉PyTables (又名表)和h5py (Pandas 也可以創建 HDF5 文件,但我沒有經驗可分享。)這兩個包的功能相似,但也有一些差異。 兩者都支持您需要的 HDF5 功能(可調整大小的數據集、同質和/或異構數據)。 h5py嘗試盡可能接近 map 將 HDF5 功能集設置為 NumPy。 PyTables在 HDF5 和 NumPy 之上有一個抽象層,具有高級索引功能,可以快速執行內核數據查詢。 (另外,我發現 PyTables I/O 比 h5py 稍快。)出於這些原因,我更喜歡 PyTables,但我對 h5py 也同樣滿意。

我應該多久寫一次:每 1 或 N 次迭代,還是最后一次?
這是可用 RAM 與所需 I/O 性能與編碼復雜性之間的權衡。 每次寫入文件都會產生 I/O“時間成本”。 因此,最快的過程是將所有數據保存在 RAM 中並在最后寫入。 這意味着您需要足夠的 memory 來保存 15 分鍾的數據流。 我懷疑 memory 要求將推動這一決定。 好消息:PyTables 和 h5py 將支持任何這些方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM