【问题标题】:How to automatically resize an HDF5 dataset with h5py?如何使用 h5py 自动调整 HDF5 数据集的大小?
【发布时间】:2021-09-24 02:57:15
【问题描述】:

有没有办法让HDF5 数据集从小尺寸开始,并在添加到其中时自动调整大小以适应越来越多的项目?

我知道使用 h5py 我可以从小处着手,使数据集的大小“无限”,如下所示:

dset = file.create_dataset("my_dataset", (1024,), maxshape=(None,))

但是我仍然必须 resize() 数据集,因为它已接近其当前容量(在上面的示例中最初为 1024)。

有没有办法让我不必在我的代码中明确地resize()

【问题讨论】:

    标签: python numpy hdf5 h5py


    【解决方案1】:

    简短回答:不。
    我不是底层 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
         
    

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 2016-04-04
      • 2022-11-14
      • 2015-09-01
      • 2015-10-29
      • 2016-03-23
      • 2016-02-27
      • 2016-06-05
      • 2020-10-27
      相关资源
      最近更新 更多