首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HDF5核心驱动程序(H5FD_CORE):加载选定的数据集

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

Stack Overflow用户
提问于 2018-01-24 00:34:59
回答 1查看 1.1K关注 0票数 0

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

代码语言:javascript
运行
复制
f = h5py.File('myfile.h5', 'r')
dset = f['mydataset'][:]

这是可行的,但是如果“mydataset”是myfile.h5中的唯一数据集,那么以下内容更有效:

代码语言:javascript
运行
复制
f = h5py.File('myfile.h5', 'r', driver='core')
dset = f['mydataset'][:]

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-25 15:21:58

我猜这是一个相同的问题,就像你在没有设置适当的块缓存大小的情况下,在一个双轴上循环读取文件一样。

如果您使用核心驱动程序读取它,则保证整个文件按顺序从磁盘和其他所有内容读取(将分组数据解压缩为压缩数据,.)完全在内存中完成。

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

代码语言:javascript
运行
复制
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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48413103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档