【问题标题】:Fast and efficient way of serializing and retrieving a large number of numpy arrays from HDF5 file从 HDF5 文件中序列化和检索大量 numpy 数组的快速有效的方法
【发布时间】: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


【解决方案1】:

根据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 

根据h5py-reading-writing-data

HDF5 数据集重复使用 NumPy 切片语法来读取和写入文件。切片规范直接转换为 HDF5“hyperslab”选择,是一种快速有效地访问文件中数据的方式

我认为将其包装在 list() 中没有任何意义;也就是说,将 3d 数组拆分为 113287 个 2d 数组的列表。 HDF5 文件上的 3d 数据集和numpy 数组之间有一个干净的映射。

h5py-fancy-indexing 警告说,花哨的数据集索引速度较慢。也就是说,试图加载该大型数据集的 [1, 1000, 3000, 6000] 子数组。

如果使用大型数据集过于混乱,您可能需要尝试编写和读取一些较小的数据集。

【讨论】:

    【解决方案2】:

    一种方法是将每个样本放入自己的组中,然后直接索引到这些组中。我认为转换需要很长时间,因为它试图将整个数据集加载到一个列表中(它必须从磁盘读取)。重新组织 h5 文件,以便

      • 样品
        • 36 x 2048 可能有助于提高索引速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 2019-01-20
      相关资源
      最近更新 更多