我有一个关于如何最好地使用python / h5py写入hdf5文件的问题。
我有类似的数据:
----------------------------------------- | timepoint | voltage1 | voltage2 | ... ----------------------------------------- | 178 | 10 | 12 | ... ----------------------------------------- | 179 | 12 | 11 | ... ----------------------------------------- | 185 | 9 | 12 | ... ----------------------------------------- | 187 | 15 | 12 | ... ...
具有约10 ^ 4列和约10 ^ 7行。(这大约是10 ^ 11(1000亿)个元素,或1个字节整数的〜100GB)。
有了这些数据,通常的用途是一次写入,多次读取,并且典型的读取情况将是获取列1和另一列(例如254),将这两个列都加载到内存中,并进行一些统计。
我认为一个好的hdf5结构将使上表中的每一列成为hdf5组,从而形成10 ^ 4组。这样,我们就不需要将所有数据读入内存,是吗?hdf5结构尚未定义,因此可以是任何东西。
现在的问题是:我一次接收到大约10 ^ 4行的数据(并且每次接收的行数并不完全相同),并且需要将其递增地写入hdf5文件。我该如何写该文件?
我正在考虑使用python和h5py,但如果推荐的话,可以使用其他工具。正在分块走的路,例如
dset = f.create_dataset("voltage284", (100000,), maxshape=(None,), dtype='i8', chunks=(10000,))
然后,当另一个10 ^ 4行的块到达时,替换数据集?
还是仅将10 ^ 4行的每个块存储为单独的数据集更好?还是我真的需要知道最终的行数?(这将很难实现,但可能)。
如果它也不是正确的工具,我也可以保释hdf5,尽管我认为一旦完成笨拙的写入操作,它就会很棒。
根据FAQ,您可以使用扩展数据集dset.resize。例如,
dset.resize
import os import h5py import numpy as np path = '/tmp/out.h5' os.remove(path) with h5py.File(path, "a") as f: dset = f.create_dataset('voltage284', (10**5,), maxshape=(None,), dtype='i8', chunks=(10**4,)) dset[:] = np.random.random(dset.shape) print(dset.shape) # (100000,) for i in range(3): dset.resize(dset.shape[0]+10**4, axis=0) dset[-10**4:] = np.random.random(10**4) print(dset.shape) # (110000,) # (120000,) # (130000,)