问题描述
假设(我在下面添加代码示例)在同一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 (将#修改为@)