同一HDF5文件中多个分块数据集的性能?

问题描述

假设(我在下面添加代码示例)在同一HDF5文件中创建多个分块数据集,并开始以随机顺序将数据追加到每个数据集。由于HDF事先不知道为每个数据集分配多少大小,因此我认为每个附加操作(或在填充时可能是数据集缓冲区)都直接附加到HDF5文件中。如果是这样,则每个数据集的数据将与其他数据集中的数据进行交织,并在整个HDF5文件中分块传播。

我的问题是:如果上面的描述或多或少是正确的,这是否会对以后从该文件执行的读取操作的性能产生不利影响,并且如果需要更多的元数据记录,还会对文件大小产生不利影响吗?并且(必然),如果存在将每个数据集存储在单独文件中的选项,那么从读取性能的角度来看这样做会更好吗?

下面是一个示例,其中介绍了如何创建我在一开始描述的HDF5文件

import h5py,numpy as np

dtype1 = np.dtype( [ ('t','f8'),('T','f8') ] )
dtype2 = np.dtype( [ ('q','i2'),('Q',('R','f8') ] )
dtype3 = np.dtype( [ ('p',('P','i8') ] )

with h5py.File('foo.hdf5','w') as f:
    dset1 = f.create_dataset('dset1',(1,),maxshape=(None,dtype=h5py.vlen_dtype(dtype1))
    dset2 = f.create_dataset('dset2',dtype=h5py.vlen_dtype(dtype2))
    dset3 = f.create_dataset('dset3',dtype=h5py.vlen_dtype(dtype3))
    for _ in range(10):
        random_lengths = np.random.randint(low=1,high=10,size=3)

        d1 = np.ones( (random_lengths[0],dtype=dtype1 )
        dset1[-1] = d1
        dset1.resize( (dset1.shape[0]+1,) )

        d2 = np.ones( (random_lengths[1],dtype=dtype2 )
        dset2[-1] = d2
        dset2.resize( (dset2.shape[0]+1,) )

        d3 = np.ones( (random_lengths[2],dtype=dtype3 )
        dset3[-1] = d3
        dset3.resize( (dset3.shape[0]+1,) )

我知道我可以同时尝试(单个文件多个数据集或多个文件单个数据集)和时间,但是结果可能取决于所用示例数据的具体情况,我希望对此有一个更一般的答案问题,或许还可以了解在这种情况下HDF5 / h5py在内部如何工作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)