【发布时间】:2019-04-01 05:39:31
【问题描述】:
我有一个庞大的 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 文件时放置的顺序检索)
【问题讨论】:
-
您可以将您的列表放在一个大的 3d 数组中,在这种情况下 memory mapping 可能会有所帮助。我不知道实际影响和速度,因此只能发表评论。
-
您正在使用分块数据集。在大多数情况下,您需要调整块缓存大小以获得合理的性能。使块大小适应您的需要也很好。如果您的顺序磁盘 IO-Speed 足够快,那么获得几百 MB/s 应该不是问题。 stackoverflow.com/a/48405220/4045774
标签: python numpy hdf5 h5py numpy-ndarray