簡體   English   中英

真空 HDF5 數據集(刪除數據行並調整大小)

[英]Vacuum HDF5 dataset (to remove rows of data and resize)

假設我有 maxshape=(None,1000), chunk=(1,1000) 的 HDF5 數據集。

然后,每當我需要刪除某行時,我只需將其歸零(很多):

  ds[ix,:] = 0

真空零行和調整數組大小的最快方法是什么?


現在讓我們添加一個轉折。 我有一個字典來解析符號 =to=> ds_ix

{ name : ds_ix }..

抽真空並保持正確 ds_ix 的最快方法是什么?

當您詢問“調整數組大小”時,您的意思是調整數據集的大小嗎? ' (另外,我假設你的意思是maxshape=(None,1000) 。)如果是這樣,你使用.resize()方法。 但是,如果您不刪除最后一行,則必須重新排列非零數據,然后調整大小。 (而且你真的不需要將行歸零,因為你要覆蓋它們。)
我可以想到 2 種重新排列數據的方法:1)使用切片表示法定義 FROM 和 TO 索引,或 2)將數據集讀入 numpy 數組,刪除行,然后將其復制回來。 兩者都涉及磁盤 I/O,因此尚不清楚如果不進行測試哪個會更快。 對於小型數據集和只有幾行已刪除的行,這可能無關緊要。 如果您打算從大型數據集中刪除大量行,我懷疑第二種方法會更好。 但是,需要進行基准測試來確認。

注意:小心設置塊大小。 請記住,這控制了 I/O 大小,當您移動行時您將執行大量 I/O。 將其設置得太小(或太大)會降低性能。 設置為 (1,1000) 可能太小了。 推薦的塊大小為 10 KiB 到 1 MiB。 (1,1000) float32 是 4 Kib。

這兩種方法都具有非常小的數據集。

創建一個 HDF5 文件:

with h5py.File('SO_73353006.h5','w') as h5f:
    a0, a1 = 10, 5
    arr = np.arange(a0*a1).reshape(a0,a1)
    ds = h5f.create_dataset('test',data=arr,maxshape=(None,a1))

方法1:移動數據,然后調整數據集大小

with h5py.File('SO_73353006.h5','r+') as h5f:
    idx = 5
    ds = h5f['test']
    #ds[idx,:] = 0 # Not required since we will overwrite the row
    a0 = ds.shape[0]
    ds[idx:a0-1] = ds[idx+1:a0]
    ds.resize(a0-1,axis=0)

方法2:提取數組,刪除行並將數據復制到調整大小的數據集

with h5py.File('SO_73353006.h5','r+') as h5f:
    idx = 5
    ds = h5f['test']
    a0 = ds.shape[0]
    a1 = ds.shape[1]
    # read dataset into array and delete row
    ds_arr = ds[()]
    ds_arr = np.delete(ds_arr, obj=idx, axis=0)  
    # Resize dataset and load array
    ds.resize(a0-1,axis=0)  # same as above
    ds[:] = ds_arr[:]
    # Create a new dataset for comparison
    ds2 = h5f.create_dataset('test2',data=ds_arr,maxshape=(None,a1))

暫無
暫無

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

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