如何使用 h5py 自动调整 HDF5 数据集的大小?
How to automatically resize an HDF5 dataset with h5py?
有没有一种方法可以让 HDF5 数据集从小开始,并在添加到其中时自动调整大小以适应越来越多的项目?
我知道使用 h5py 我可以从小处着手并使数据集的大小“无限”,如下所示:
dset = file.create_dataset("my_dataset", (1024,), maxshape=(None,))
但是 AFAIK 我仍然需要 resize()
数据集,因为它接近其当前容量(在上面的示例中最初是 1024)。
有没有办法让我不必在我的代码中显式 resize()
?
简答:否
我不是底层 HDF5 库的专家,但我认为它们不具备此功能(h5py 只是一个包装器)。 (某种)好消息:如果您尝试写入超出分配的大小,h5py 将抛出异常。
下面的代码扩展了您的示例以进行演示。
with h5py.File('SO_68389770.h5','w') as h5f:
dset = h5f.create_dataset("my_dataset", (1024,), maxshape=(None,))
size = 100
for i in range(10):
arr = np.random.random(size)
start, end = i*size, i*size+size
dset[start:end] = arr
这适用于 range(10)
。 range(11)
:
你会得到这个错误
TypeError: Can't broadcast (100,) -> (24,)
下面的代码通过在写入前检查 dset.shape[0]
来干净地处理任何大小。
with h5py.File('SO_68389770.h5','w') as h5f:
dset = h5f.create_dataset("my_dataset", (1024,), maxshape=(None,))
size = 100
for i in range(13):
arr = np.random.random(size)
start, end = i*size, i*size+size
if dset.shape[0] >= end :
dset[start:end] = arr
else:
print(f'insufficient dset size, end={end}; resizing')
dset.resize(end,axis=0)
dset[start:end] = arr
有没有一种方法可以让 HDF5 数据集从小开始,并在添加到其中时自动调整大小以适应越来越多的项目?
我知道使用 h5py 我可以从小处着手并使数据集的大小“无限”,如下所示:
dset = file.create_dataset("my_dataset", (1024,), maxshape=(None,))
但是 AFAIK 我仍然需要 resize()
数据集,因为它接近其当前容量(在上面的示例中最初是 1024)。
有没有办法让我不必在我的代码中显式 resize()
?
简答:否
我不是底层 HDF5 库的专家,但我认为它们不具备此功能(h5py 只是一个包装器)。 (某种)好消息:如果您尝试写入超出分配的大小,h5py 将抛出异常。
下面的代码扩展了您的示例以进行演示。
with h5py.File('SO_68389770.h5','w') as h5f:
dset = h5f.create_dataset("my_dataset", (1024,), maxshape=(None,))
size = 100
for i in range(10):
arr = np.random.random(size)
start, end = i*size, i*size+size
dset[start:end] = arr
这适用于 range(10)
。 range(11)
:
你会得到这个错误
TypeError: Can't broadcast (100,) -> (24,)
下面的代码通过在写入前检查 dset.shape[0]
来干净地处理任何大小。
with h5py.File('SO_68389770.h5','w') as h5f:
dset = h5f.create_dataset("my_dataset", (1024,), maxshape=(None,))
size = 100
for i in range(13):
arr = np.random.random(size)
start, end = i*size, i*size+size
if dset.shape[0] >= end :
dset[start:end] = arr
else:
print(f'insufficient dset size, end={end}; resizing')
dset.resize(end,axis=0)
dset[start:end] = arr