python - 从 HDF5 文件中序列化和检索大量 numpy 数组的快速有效的方法
问题描述
我有一个庞大的 numpy 数组列表,特别113287
是每个数组的形状36 x 2048
。就内存而言,这相当于32 GB。
到目前为止,我已经将这些数组序列化为一个巨大的 HDF5 文件。现在,问题是每次访问从这个 hdf5 文件中检索单个数组都需要非常长的时间(10 分钟以北)。
我怎样才能加快速度?这对我的实现非常重要,因为我必须在这个列表中索引数千次才能输入深度神经网络。
这是我如何索引 hdf5 文件:
In [1]: import h5py
In [2]: hf = h5py.File('train_ids.hdf5', 'r')
In [5]: list(hf.keys())[0]
Out[5]: 'img_feats'
In [6]: group_key = list(hf.keys())[0]
In [7]: hf[group_key]
Out[7]: <HDF5 dataset "img_feats": shape (113287, 36, 2048), type "<f4">
# this is where it takes very very long time
In [8]: list(hf[group_key])[-1].shape
Out[8]: (36, 2048)
有什么想法可以加快速度吗?有没有其他方法可以序列化这些数组以加快访问速度?
注意:我使用的是 Python 列表,因为我希望保留顺序(即以与创建 hdf5 文件时放置的顺序相同的顺序检索)
解决方案
根据Out[7]
,“img_feats”是一个大型 3d 数组。(113287, 36, 2048) 形状。
定义ds
为数据集(不加载任何内容):
ds = hf[group_key]
x = ds[0] # should be a (36, 2048) array
arr = ds[:] # should load the whole dataset into memory.
arr = ds[:n] # load a subset, slice
HDF5 数据集重新使用 NumPy 切片语法来读取和写入文件。切片规范直接转换为 HDF5“hyperslab”选择,是访问文件中数据的一种快速有效的方式。
list()
我认为将其包含在;中没有任何意义。也就是说,将 3d 数组拆分为 113287 个 2d 数组的列表。numpy
HDF5 文件和数组上的 3d 数据集之间有一个干净的映射。
h5py-fancy-indexing警告数据集的精美索引速度较慢。也就是说,试图加载该大型数据集的 [1, 1000, 3000, 6000] 子数组。
如果使用大型数据集过于混乱,您可能想尝试编写和读取一些较小的数据集。
推荐阅读
- c# - STARS.Web.csproj' 以 'net471' 为目标。以 '.NETStandard,Version=v2.0' 为目标的项目不能引用它
- spring-boot - 支持 MQTT 的 API 网关 (IOT)
- docker - 如何为其他 Docker 容器和堆栈制作 Docker VPN 网关?
- svn - svnsync 错误 - 目录 xxx 已过期
- r - 分别获取密码子内同义和非同义核苷酸位置的范围
- javascript - NPM包Concurrently真的执行并行执行否则如何执行并行执行
- symfony - Symfony 4,为多对多关系上下文中的 findby 自定义方法提供简单示例
- ruby-on-rails - Rspec 组测试输出
- node.js - 如何以 zipkin ui 支持的格式(json)将 zipkin 跟踪写入文件?
- ansible - 脚本中的 Ansible 变量