2017-01-25 1 views
2

J'ai un problème mineur avec le paquet h5py de python. Je travaille avec des jeux de données très volumineux (environ 250k fragments d'image) stockés dans un fichier hdf5 sous forme de tableau avec les dimensions (num_images x color_channels x largeur x hauteur)Augmenter la vitesse de lecture pour h5py

Cet ensemble de données est séparé de façon aléatoire en formation et validation Les données. Par conséquent, j'ai besoin de lire des éléments aléatoires de ces données lors de la formation de mon classificateur.

J'ai fait la découverte bizarre que le chargement de l'ensemble des données (toutes les 250 000 images) est BEAUCOUP plus rapide que la lecture d'un sous-ensemble spécifique de ces données. Plus précisément, la lecture de l'ensemble du réseau en tant que:

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

est plus rapide d'un facteur de 5 que si je vous ai lu seulement un sous-ensemble aléatoire, non-séquentielle de ces images (25K images):

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

Est-ce intentionnel? Est-ce dû à la compression du fichier hdf5?

Répondre

3

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

Un sous-ensemble de la syntaxe de fantaisie indexation NumPy est supporté. Utilisez ceci avec précaution, car les mécanismes HDF5 sous-jacents peuvent avoir des performances différentes de celles attendues.

Très longues listes (> 1000 éléments) peuvent produire de mauvaises performances

indexation avancée nécessite la lecture d'un bloc de données ici, puis sauter une certaine distance et la lecture de l'autre et ainsi de suite. Si ces données sont toutes en mémoire, comme dans un tampon de données ndarray, cela peut être fait relativement rapidement, bien que plus lent que de lire le même nombre d'octets dans un bloc contigu. Lorsque ces données sont dans un fichier, vous devez inclure la recherche de fichier et la lecture de bloc.

Aussi, si vous utilisez Chunking et à la compression:

Chunking a des répercussions sur la performance. Il est recommandé de garder la taille totale de vos blocs entre 10 KiB et 1 Mio, plus grande pour les jeux de données plus volumineux. Gardez également à l'esprit que lorsque vous accédez à un élément d'un bloc, le bloc entier est lu sur le disque.

Je me demande si l'enregistrement des images en tant que jeux de données individuels améliorerait les performances. Vous devez ensuite les récupérer par nom plutôt que par index de 1ère dimension. Vous auriez à les rejoindre dans 4d array, mais je suppose que h5py doit le faire de toute façon (il les aura lu individuellement).