[英]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.