提高h5py的阅读速度

时间:2017-01-25 16:15:46

标签: python numpy hdf5

我在使用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文件吗?

1 个答案:

答案 0 :(得分:3)

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

  

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

     

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

高级索引要求在此处读取数据块,然后跳过一段距离并读取另一个等等。如果该数据全部在内存中,如在ndarray数据缓冲区中,则可以相对快速地完成,但比在一个连续块中读取相同数量的字节慢。当该数据在文件中时,您必须包括文件搜索和块读取。

此外,如果您正在使用分块和压缩:

  

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

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