如何在 python 的帮助下跟踪和显示在 HDF5 文件中所做的持续更改

How can I track and display constant changes made in an HDF5 file with the help of python

我有这个功能,每秒不断地在 HDF5 文件的数据集数组中添加一个新元素。

from time import time, sleep

i = 100

def update_array():

    hf = h5py.File('task1.h5', 'r+')
    old_rec = np.array(hf.get('array'))
    global i
    i = i+1
    new_rec = np.append(old_rec, i)

    #deleting old record andreplacing with updated record
    del hf['array']
    new_data = hf.create_dataset('array', data = new_rec)
    print(new_rec)
    
    hf.close()

while True:
    sleep(1 - time() % 1)
    update_array()

打印行的输出(基本上显示更新后的数组.....我们不知道它是否被保存在文件中):

[101.]
[101. 102.]
[101. 102. 103.]
[101. 102. 103. 104.]
[101. 102. 103. 104. 105.]
[101. 102. 103. 104. 105. 106.]
[101. 102. 103. 104. 105. 106. 107.]
[101. 102. 103. 104. 105. 106. 107. 108.]

我想要一个单独的笔记本,可以跟踪上述功能所做的更改,并显示 HDF5 文件系统中存在的此数据集的更新内容。

我想要一个单独的函数来完成这项任务,因为我想确保更新的内容保存在 HDF5 文件中,并在它们不断到达时对其执行进一步的动态操作。

这是一个将属性附加到 'array' 数据集的潜在解决方案。使用 .attrs 可以轻松地向 HDF5 数据对象添加属性。它有一个类似字典的语法:h5obj[attr_name] = attr_value。属性值类型可以是整数、字符串、浮点数和数组。您可以使用以下 2 行向数据集添加 2 个属性:

hf['array'].attrs['Last Value'] = i
hf['array'].attrs['Time Added'] = ctime(time())

为了演示,我将这些行添加到您的代码中,并进行了一些其他修改以解决以下问题:

  1. 更正我的评论中指出的错误(我添加了 create_array() 来最初创建文件和数据集。我将其创建为 resizable 数据集以简化逻辑 update_array().
  2. 我修改了 update_array() 代码以扩大数据集并附加新值。这比您的 4 步过程更简洁(也更快)。
  3. 我使用 Python 的 with / as: 上下文管理器打开文件。这消除了关闭它的需要,并且(更重要的是)确保它在程序异常退出时干净地关闭。
  4. 我删除了 NumPy 函数。如果您是,则无需创建数组 每次加 1 个标量。
  5. 我的打印语句显示了从一个数组创建一个 NumPy 数组的首选方法 数据集。使用 hf['array'][:] 而不是 np.array(hf.get('array')).
  6. 我更喜欢打开文件一次(除非有令人信服的理由打开和关闭)。这消除了 file setup/teardown 开销。我没有这样做。如果需要,将 with / as: 行移至主函数并将生成的 hf 对象传递给 create_array()update_array() 函数。如果这样做,您可以轻松地合并这两个功能。 (您将需要逻辑来测试 'array' 数据集是否存在。)

代码如下:

import h5py
from time import time, sleep, ctime

def create_array():

    with h5py.File('task1.h5', 'w') as hf:
        global i 

        #create dataset and add new record
        new_data = hf.create_dataset('array', shape=(1,), maxshape=(None,),
                                      data = [i])
        # add attributes
        hf['array'].attrs['Last Value'] = i
        hf['array'].attrs['Time Added'] = ctime(time())

        print(hf['array'][:])

def update_array():

    with h5py.File('task1.h5', 'r+') as hf:
        global i 
        i += 1
      
        #resize dataset and add new record
        a0 = hf['array'].shape[0]
        hf['array'].resize(a0+1,axis=0)
        hf['array'][a0] = i
        
        # add attributes
        hf['array'].attrs['Last Value'] = i
        hf['array'].attrs['Time Added'] = ctime(time())
        
        print(hf['array'][:])
    
i = 100
create_array()

while i < 110:
    sleep(1 - time() % 1)
    update_array()

print('Done')