2014-07-15 2 views
0

J'ai un grand nombre d'images de différentes catégories, par ex. "Chat", "Chien", "Oiseau". Les images ont une structure hiérarchique, comme un dict. Ainsi, par exemple, la clé est le nom de l'animal et la valeur est une liste d'images animales, par ex. animalPictures[animal][index]. Je souhaite manipuler chaque image (par exemple un histogramme de calcul), puis enregistrer les données manipulées dans une structure correspondante identique, par ex. animalPictures['bird'][0] a son histogramme stocké dans animalHistograms['bird'][0].Manipulation de grandes quantités de données d'image en Python

Le seul problème est que je n'ai pas assez de mémoire pour charger toutes les images, effectuer toutes les manipulations et créer une structure supplémentaire des images transformées.

Est-il possible de charger une image à partir du disque, de manipuler l'image et de diffuser les données sur un disque dict on? De cette façon, je pourrais travailler sur une base par image et ne pas se soucier de tout charger en mémoire à la fois.

Merci!

Répondre

0

Il est possible, si vous nous NumPy et surtout numpy.memmap pour stocker les données d'image. De cette façon, les données de l'image semblent être en mémoire mais sont sur le disque en utilisant le mécanisme mmap. La bonne chose est que les baies numpy.memmap ne sont pas plus difficiles à manipuler que les baies ordinaires.

Il y a un surcoût lié aux performances car toutes les baies memmap sont enregistrées sur le disque. Les matrices peuvent être décrites comme des "matrices sauvegardées sur disque", c'est-à-dire que les données sont également conservées dans la RAM aussi longtemps que possible. Cela signifie que si vous accédez très souvent à un tableau de données, c'est très probablement dans la mémoire, et il n'y a pas de surcharge de lecture de disque. Donc, gardez vos métadonnées dans un dict en mémoire, mais memmap vos plus grandes baies.

C'est probablement le moyen le plus simple. Cependant, assurez-vous que vous avez un Python 64 bits en cours d'utilisation, car le 32 bits sort des adresses ad 2 GiB.

Bien sûr, il existe de nombreuses façons de compresser les données d'image. Si vos données peuvent être compressées, vous pouvez envisager d'utiliser la compression pour économiser de la mémoire.

+0

Existe-t-il du code de base en python où je peux traiter un grand raster (20G +) en morceaux/patches (je crois que c'est une fenêtre glissante) en utilisant le memmap de numpy? Merci d'avance. –

1

Je suggère d'utiliser le module shelve qui fournit des objets persistants de type dictionnaire sauvegardés par un objet fichier. Pour la plupart, vous pouvez les utiliser comme des dictionnaires ordinaires, donc la conversion de tout code existant qui les utilise est relativement facile. Il existe quelques méthodes supplémentaires pour contrôler l'écriture des entrées en cache et la fermeture de l'objet.

Fondamentalement, il vous permettra de stocker de manière transparente vos données de dictionnaire Python dans une base de données basée sur des fichiers sous-jacents. Toutes les entrées accédées sont également mises en cache en mémoire. Cependant, vous pouvez empêcher le cache de consommer trop de mémoire en appelant manuellement la méthode sync() qui écrit les entrées modifiées sur le disque et vide le cache.

Questions connexes