繁体   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