如何在 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())
为了演示,我将这些行添加到您的代码中,并进行了一些其他修改以解决以下问题:
- 更正我的评论中指出的错误(我添加了
create_array()
来最初创建文件和数据集。我将其创建为 resizable 数据集以简化逻辑 update_array()
.
- 我修改了
update_array()
代码以扩大数据集并附加新值。这比您的 4 步过程更简洁(也更快)。
- 我使用 Python 的
with / as:
上下文管理器打开文件。这消除了关闭它的需要,并且(更重要的是)确保它在程序异常退出时干净地关闭。
- 我删除了 NumPy 函数。如果您是,则无需创建数组
每次加 1 个标量。
- 我的打印语句显示了从一个数组创建一个 NumPy 数组的首选方法
数据集。使用
hf['array'][:]
而不是 np.array(hf.get('array'))
.
- 我更喜欢打开文件一次(除非有令人信服的理由打开和关闭)。这消除了 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')
我有这个功能,每秒不断地在 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())
为了演示,我将这些行添加到您的代码中,并进行了一些其他修改以解决以下问题:
- 更正我的评论中指出的错误(我添加了
create_array()
来最初创建文件和数据集。我将其创建为 resizable 数据集以简化逻辑update_array()
. - 我修改了
update_array()
代码以扩大数据集并附加新值。这比您的 4 步过程更简洁(也更快)。 - 我使用 Python 的
with / as:
上下文管理器打开文件。这消除了关闭它的需要,并且(更重要的是)确保它在程序异常退出时干净地关闭。 - 我删除了 NumPy 函数。如果您是,则无需创建数组 每次加 1 个标量。
- 我的打印语句显示了从一个数组创建一个 NumPy 数组的首选方法
数据集。使用
hf['array'][:]
而不是np.array(hf.get('array'))
. - 我更喜欢打开文件一次(除非有令人信服的理由打开和关闭)。这消除了 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')