目前,我通过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
驱动程序映射它的内存有很大不同吗?
答案 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)