【问题标题】:Increasing reading speed for h5py提高 h5py 的阅读速度
【发布时间】:2017-06-10 22:06:09
【问题描述】:

我在使用 python 的 h5py 包时遇到了一个小问题。我正在使用存储在 hdf5 文件中的非常大的数据集(约 250k 小图像片段)作为尺寸为(num_images x color_channels x width x height)的数组

此数据集被随机分为训练数据和验证数据。因此,我需要在训练分类器时读出这些数据的随机元素。

对我来说,我发现了一个奇怪的发现,即加载整个数据集(所有 250k 图像)比读取该数据的特定子集要快得多。具体来说,将整个数组读取为:

data = h5py.File("filename.h5", "r")["images"][:]

比我只读出这些图像的随机、非连续子集(25k 图像)快约 5 倍:

indices = [3, 23, 31, 105, 106, 674, ...]
data = h5py.File("filename.h5", "r")["images"][indices, :, :, :]

这是设计使然吗?是不是压缩hdf5文件的原因?

【问题讨论】:

    标签: python numpy hdf5


    【解决方案1】:

    http://docs.h5py.org/en/latest/high/dataset.html#fancy-indexing

    支持 NumPy 花式索引语法的子集。请谨慎使用,因为底层 HDF5 机制的性能可能与您的预期不同。

    很长的列表(> 1000 个元素)可能会导致性能不佳

    高级索引需要在这里读取一个数据块,然后跳过一段距离并读取另一个,依此类推。如果该数据都在内存中,例如在ndarray 数据缓冲区中,则可以相对较快地完成,尽管比在一个连续块中读取相同数量的字节要慢。当该数据在文件中时,您必须包括文件查找和块读取。

    如果您使用分块和压缩:

    分块会影响性能。建议将块的总大小保持在 10 KiB 和 1 MiB 之间,对于较大的数据集更大。还要记住,当访问块中的任何元素时,会从磁盘读取整个块。

    我想知道将图像保存为单独的数据集是否会提高性能。然后,您将按名称而不是一维索引来检索它们。您必须将它们加入 4d 数组,但我怀疑 h5py 无论如何都必须这样做(它会单独读取它们)。

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 1970-01-01
      • 2019-06-22
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      相关资源
      最近更新 更多