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?
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. " –
Powoduje to, że 'getsizeof' jest niewiarygodnym wskaźnikiem zużycia pamięci, zwłaszcza dla rozszerzeń innych producentów. –
Zasadniczo problem polega na tym, że 'resize' zwraca" widok ", a nie nową tablicę. Dostajesz rozmiar widoku, a nie rzeczywiste dane. – mgilson