小编典典

用h5py增量写入hdf5

python

我有一个关于如何最好地使用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,尽管我认为一旦完成笨拙的写入操作,它就会很棒。


阅读 256

收藏
2020-12-20

共1个答案

小编典典

根据FAQ,您可以使用扩展数据集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,)
2020-12-20