【问题标题】:HDF5 core driver (H5FD_CORE): loading selected dataset(s)HDF5 核心驱动程序 (H5FD_CORE):加载选定的数据集
【发布时间】:2018-07-02 22:40:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 请补充一些细节:1)您从哪个设备读取(SSD,HDD,NAS)2)块大小3)压缩算法4)工作系统5)最重要的是:哪种速度你在这两种情况下都获得。这样的性能问题实际上可能取决于很多事情......

标签: python hdf5


【解决方案1】:

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

如果您使用核心驱动程序读取它,则可以保证从磁盘顺序读取整个文件,而其他所有操作(解压缩、分块数据到压缩数据……)完全在 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 (默认块缓存大小为 1MB)

【讨论】:

  • 是否可以使用低级 h5py 接口而不是 h5py_cache 库设置块缓存大小?不幸的是,我们无权访问 h5py_cache。
  • 是的。查看 h5py-cache 包中的 init.py。它实际上只是 h5py 低级函数的一个非常简单的纯 Python 包装器。该软件包的目的是为用户简化事情,如果将来在官方 h5py 软件包中实现它,那将是非常棒的。它实际上只有 75 行代码,有很多 cmets....
  • 我去看看。到目前为止,我已经避免了它,因为我无法访问 h5py_cache,但这可能会产生巨大的改进。我同意它应该在 h5py 中实现。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2016-12-02
  • 2010-11-22
  • 1970-01-01
相关资源
最近更新 更多