Utilisation de la mémoire python des tableaux numpy

J'utilise python pour analyser certains fichiers volumineux et je rencontre des problèmes de mémoire, donc j'utilise sys.getsizeof() pour essayer de garder une trace de l'utilisation, mais son comportement avec les tableaux numpy est bizarre. Voici un exemple impliquant une carte d'albedos que je dois ouvrir:

>>> import numpy as np
>>> import struct
>>> from sys import getsizeof
>>> f = open('Albedo_map.assoc', 'rb')
>>> getsizeof(f)
144
>>> albedo = struct.unpack('%df' % (7200*3600), f.read(7200*3600*4))
>>> getsizeof(albedo)
207360056
>>> albedo = np.array(albedo).reshape(3600,7200)
>>> getsizeof(albedo)
80

Eh bien, les données sont toujours là, mais la taille de l'objet, une carte de 3600x7200 Pixels, est passée de ~200 Mo à 80 octets. J'espère que mes problèmes de mémoire sont terminés et que tout est converti en numpy tableaux, mais je pense que ce comportement, s'il est vrai, violerait d'une certaine manière une loi de la théorie de l'information ou de la thermodynamique, ou quelque chose, donc je suis enclin à croire que getsizeof() ne fonctionne pas avec les tableaux numpy. Des idées?

101
demandé sur EddyTheB 2012-08-02 23:19:22

2 réponses

Vous pouvez utiliser array.nbytes pour les tableaux numpy, par exemple:

>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192
150
répondu GWW 2018-02-14 21:37:12

Le champ nbytes vous donnera la taille en octets de tous les éléments de la matrice dans un numpy.array:

size_in_bytes = my_numpy_array.nbytes

Notez que cela ne mesure pas les "attributs non-éléments de l'objet array", donc la taille réelle en octets peut être de quelques octets plus grande que cela.

1
répondu El Marce 2018-06-18 15:23:31