如何使用 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