簡體   English   中英

如何使用 h5py 自動調整 HDF5 數據集的大小?

[英]How to automatically resize an HDF5 dataset with h5py?

有沒有辦法讓HDF5數據集從小尺寸開始並自動調整大小以適應越來越多的項目?

我知道使用h5py我可以從小處開始並使數據集的大小“無限”,如下所示:

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

但是 AFAIK 我仍然需要resize()數據集的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
     

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM