2012-08-02 15 views
84

Bazı büyük dosyaları analiz etmek için python kullanıyorum ve bellek sorunları ile karşılaşıyorum, bu yüzden sys.getsizeof() işlevini kullanmayı denemek ve kullanmak için kullanıyorum, ancak numpy dizileri ile davranış tuhaftır. İşte açmaya yaşıyorum albedos bir haritasını içeren bir örnek: hala oradaSayısal dizilerin Python bellek kullanımı

>>> 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, verileri, ancak nesne, bir 3600x7200 piksel haritanın boyutunu 80 bayt ~ 200 Mb gitti . Bellek sorunlarımın sona erdiğini ve herşeyi uyuşuk dizilere dönüştürdüğünü ummak isterim, fakat eğer bu davranış doğruysa, bir şekilde bilgi teorisi ya da termodinamiğin bazı yasalarını ya da bir şeyi ihlal ediyormuş gibi hissediyorum. getsizeof() 'in numpy dizileriyle çalışmadığına inanmaya yatkın. Herhangi bir fikir?

+4

: Msgstr "Nesnenin boyutunu byte cinsinden döndürür. Nesne herhangi bir nesne olabilir. Tüm yerleşik nesneler doğru sonuçları döndürür, ancak bu uygulama, belirli bir uygulama olduğu için üçüncü taraf uzantıları için geçerli değildir." Sadece doğrudan bellek tüketimi nesneye atıfta bulunulan nesnelerin bellek tüketimini değil, hesaba katılır. " –

+0

Bu, üçüncü taraf uzantıları için _especially_ için güvenilir bir bellek tüketim göstergesi "getsizeof" yapar. –

+7

Temel olarak, buradaki sorun, "resize" nin "görünüm" değil, yeni bir dizi döndürmesidir. Görüntünün boyutunu, gerçek verileri değil. – mgilson

cevap

125

Örneğin, numpy diziler için array.nbytes kullanabilirsiniz:

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

Evet, işte bu kadar. albedo.nbytes beklendiği gibi 207360000 verir. Teşekkürler. – EddyTheB

+0

Onun sys.getsizeof (a), ithalat sys yaptıktan sonra. – eddys

0

aşağıdaki eserlerini yeni bir dizi oluşturmak zorunda kalmadan: sys.getsizeof` `dokümanlar itibaren

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