2012-08-02 12 views
84

Używam Pythona do analizowania dużych plików i mam problemy z pamięcią, więc używam sys.getsizeof(), aby spróbować śledzić użycie, ale jest to zachowanie z numpy tablic jest dziwne. Oto przykład z udziałem mapę albedo, że jestem konieczności otwierania:Używanie pamięci Python z numpy tablic

>>> 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 

dobrze dane nadal tam jest, ale rozmiar obiektu, mapa 3600x7200 pikseli, upadł z ~ 200 MB do 80 bajtów . Chciałbym mieć nadzieję, że moje problemy z pamięcią się skończyły i po prostu przekształcić wszystko w numpy arrays, ale czuję, że to zachowanie, jeśli jest prawdziwe, w jakiś sposób naruszałoby pewne prawo teorii informacji lub termodynamiki, czy coś takiego, więc jestem skłonni wierzyć, że getsizeof() nie działa z numpy tablicami. Jakieś pomysły?

+4

Od docs na 'sys.getsizeof': "Zwróć rozmiar obiektu w bajtach Obiektem może być dowolny typ obiektu.Wszystkie obiekty wbudowane zwrócą poprawne wyniki, ale nie musi to być prawda w przypadku rozszerzeń stron trzecich, ponieważ jest to specyficzne dla implementacji Tylko zużycie pamięci bezpośrednio przypisywane obiektowi, a nie zużycie pamięci obiektów, do których się odnosi. " –

+0

Powoduje to, że 'getsizeof' jest niewiarygodnym wskaźnikiem zużycia pamięci, zwłaszcza dla rozszerzeń innych producentów. –

+7

Zasadniczo problem polega na tym, że 'resize' zwraca" widok ", a nie nową tablicę. Dostajesz rozmiar widoku, a nie rzeczywiste dane. – mgilson

Odpowiedz

125

Można użyć array.nbytes dla NumPy tablic, na przykład:

>>> import numpy as np 
>>> from sys import getsizeof 
>>> a = [0] * 1024 
>>> b = np.array(a) 
>>> getsizeof(a) 
8264 
>>> b.nbytes 
8192 
+3

Tak, to jest to. albedo.nbytes podaje 207360000 zgodnie z oczekiwaniami. Dzięki. – EddyTheB

+0

Jego sys.getsizeof (a), po wykonaniu importu sys. – eddys

0

następujące prace bez konieczności tworzenia nowej tablicy:

import numpy as np 
a = np.arange(81).reshape(9,9) 
a.size * a.dtype.itemsize