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

HDF5 core driver (H5FD_CORE): loading selected dataset(s)

目前,我通过 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'][:]

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

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

我知道一种替代方法是将包含许多数据集的单个 HDF5 文件拆分为多个 HDF5 文件,每个文件包含一个数据集。但是,我希望可能有一个更优雅的解决方案,可能使用 h5py low-level API.

更新: 即使我问的不可能,有人能解释为什么在读取整个数据集时使用 driver='core' 有更好的性能吗?将 HDF5 文件的唯一数据集读入内存与通过 core 驱动程序将其映射到内存有很大不同吗?

我想这与您通过在任意轴上循环读取文件而没有设置适当的块缓存大小是同一个问题。

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

我使用了这里 最简单形式的花式切片示例来写入数据。

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(默认块缓存大小为 1MB)