提高h5py读取速度

4
我在使用Python的h5py包时遇到了一些小问题。我正在处理非常大的数据集(约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个回答

3

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

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

超长列表(>1000个元素)可能会导致性能下降。

高级索引需要在此处读取一块数据,然后跳过一些距离并再次读取另一块数据。如果该数据都在内存中,就像在ndarray数据缓冲区中一样,这可以相对快速地完成,但比在一个连续块中读取相同数量的字节要慢。当该数据在文件中时,必须包括文件查找和块读取。

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

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

我想知道将图像保存为单独的数据集是否会提高性能。然后,您可以通过名称而不是第一维索引来检索它们。您必须将它们合并为4d数组,但我认为h5py无论如何都必须这样做(它将逐个读取它们)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接