目前,我通过h5py在python中加载h5py数据,并将数据集读入内存。
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
驱动程序映射内存有很大不同?
发布于 2018-01-25 15:21:58
我猜这是一个相同的问题,就像你在没有设置适当的块缓存大小的情况下,在一个双轴上循环读取文件一样。
如果您使用核心驱动程序读取它,则保证整个文件按顺序从磁盘和其他所有内容读取(将分组数据解压缩为压缩数据,.)完全在内存中完成。
从这里开始,我使用了最简单的花哨切片示例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)。
https://stackoverflow.com/questions/48413103
复制相似问题