代码之家  ›  专栏  ›  技术社区  ›  kmario23 Mazdak

从HDF5文件序列化和检索大量numpy数组的快速有效方法

  •  0
  • kmario23 Mazdak  · 技术社区  · 7 年前

    113287 36 x 2048 . 就记忆而言,这相当于 32千兆字节 .

    到目前为止,我已经将这些数组序列化为一个巨大的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文件时的顺序进行检索)

    2 回复  |  直到 7 年前
        1
  •  2
  •   kmario23 Mazdak    7 年前

    Out[7] ,“imgèu feats”是一个大型3d阵列(113287,362048)形状。

    定义 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 :

    快速高效的数据访问方式

    我看不出把它包起来有什么意义 list() numpy

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

    如果处理这个大数据集太混乱,您可能需要尝试编写和读取一些较小的数据集。

        2
  •  1
  •   cvanelteren    7 年前

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

    • 组
      • 样品
        • 36 x 2048毫米