HDF5核心驱动程序(H5FD_CORE):加载选定的数据集

时间:2018-01-24 00:34:59

标签: python hdf5

目前,我通过h5py在python中加载HDF5数据并将数据集读入内存。

f = h5py.File('myfile.h5', 'r')
dset = f['mydataset'][:]

这样可行,但如果' mydataset'是myfile.h5中唯一的数据集,然后以下更有效:

f = h5py.File('myfile.h5', 'r', driver='core')
dset = f['mydataset'][:]

我相信这是因为'核心'驱动程序内存映射整个文件,这是一种将数据加载到内存中的优化方法。

我的问题是:是否可以使用'核心' 选择数据集上的驱动程序?换句话说,在加载文件时,我只希望存储映射选定的数据集和/或组。我有一个包含许多数据集的文件,我想按顺序将每个数据集加载到内存中。我无法一次性加载它们,因为总的来说它们不适合记忆。

我理解一种方法是将包含许多数据集的单个HDF5文件拆分为多个HDF5文件,每个文件包含一个数据集。但是,我希望可能有更优雅的解决方案,可能使用h5py低级API。

更新:即使我无法提出要求,有人可以解释为什么在阅读整个数据集时使用driver='core'会有更好的效果吗?将HDF5文件的唯一数据集读入内存与通过core驱动程序映射它的内存有很大不同吗?

1 个答案:

答案 0 :(得分:1)

我猜这是同样的问题,就像你通过在没有设置正确的chunk-cache-size的情况下循环遍历一个轴来读取文件一样。

如果您正在使用核心驱动程序阅读它,则可以保证从磁盘顺序读取整个文件,其他所有内容(解压缩,分块数据到压缩数据......)都完全在RAM中完成。

我使用了https://stackoverflow.com/a/48405220/4045774这里最简单的花式切片示例来编写数据。

import h5py as h5
import time
import numpy as np
import h5py_cache as h5c

def Reading():
    File_Name_HDF5='Test.h5'

    t1=time.time()
    f = h5.File(File_Name_HDF5, 'r',driver='core')
    dset = f['Test'][:]
    f.close()
    print(time.time()-t1)

    t1=time.time()
    f = h5c.File(File_Name_HDF5, 'r',chunk_cache_mem_size=1024**2*500)
    dset = f['Test'][:]
    f.close()
    print(time.time()-t1)

    t1=time.time()
    f = h5.File(File_Name_HDF5, 'r')
    dset = f['Test'][:]
    print(time.time()-t1)
    f.close()

if __name__ == "__main__":
    Reading()

这在我的机器上提供 2,38s (核心驱动程序), 2,29s (500 MB块高速缓存大小), 4,29s (默认的chunk-cache-size为1MB)