2010-06-21 14 views
5

Yazdığım program, sözlüklerde çok miktarda veri saklar. Spesifik olarak, her biri 15 yüzdeli, 1500 float içeren bir sınıfın 1588 örneğini oluşturuyorum. Bu işlem dizüstü bilgisayarımdaki 2GB'lık belleği oldukça hızlı bir şekilde kullanıyor (sınıfın 1000'inci örneğinde takas yazmaya başladım).Python bellek kullanımı: Nesnemden hangisi en fazla belleği alıyor?

Benim sorum şu, hangisi belleklerimi kullanıyor?

  • 34 milyon bazı çift yüzer?
  • 22.500'ün üstü sözlükten mi geliyorsunuz?
  • 1500 sınıfının tepesi?

Bana göre, bellek domuzunun bellekte tuttuğum çok sayıda kayan nokta sayısı olması gerekir. Ancak, şu ana kadar okuduğum doğru ise, her bir kayan nokta sayım 16 bayt alır. 34 milyon çiftim olduğu için, bu sadece bir gigabaytın üzerinde olması gereken yaklaşık 108 milyon bayt olmalıdır.

Burada dikkate almadığım bir şey var mı?

cevap

7

yüzer tanesi 16 bayt alır yapmak ve 100k yaklaşık 1500 girişlerle dict:

>> sys.getsizeof(1.0) 
16 
>>> d = dict.fromkeys((float(i) for i in range(1500)), 2.0) 
>>> sys.getsizeof(d) 
98444 

böylece 22.500 dicts kendi başlarına 2GB devralmak, 68 milyon böylece başka GB veya yüzer. 68 milyon kere 16 eşit olarak sadece 100M'yi nasıl hesapladığınızdan emin değilsiniz - bir yere sıfıra düşmüş olabilirsiniz.

Sınıfın kendisi ihmal edilebilir bir miktar alır ve bunun 1500 örneğini (elbette atıfta buldukları nesnelerden net olarak, getsizeof bize dicts için net miktarlar verir) her biri küçük bir dict'dan çok fazla değil, yani Bu sorun değil. Yani .: sınıf için

>>> sys.getsizeof(Sic) 
452 
>>> sys.getsizeof(Sic()) 
32 
>>> sys.getsizeof(Sic().__dict__) 
524 

452, tüm örneklerini (524 + 32) * 1550 = 862K, size dicts ve banyolarında gigabayt her varken o endişe değil gördüğünüz gibi.

+0

Yukarıdaki kodda 1500 yerine aralık (1000) veya aralık (1250) eklerseniz, 24712 bayt boyut alırım. Bu, boyutun (1365) bu noktaya kadar, boyutta ihtiyatlı bir sıçrama olduğunu görünce doğrudur. Python'un belleği nasıl ayırdığı doğru mu? Eğer öyleyse, neden bu durumda? – Wilduck

+0

Ben bir Python şamandıranı, genellikle 64-bit (8 byte) olacak bir C çiftini kullanarak uygulanmıştı. Ve çift tip 'struct' modülünde 8 bayt alır. 'Getsizeof' sonucunu tartışamam ... –

+1

@Scott, her Python nesnesinin "yükü" ne ek olarak bir miktar yükü (referans sayacı, türüne işaretçi) vardır ve tüm ayırmalar yuvarlanır sistem malloc ile birlikte iyi çalmak için 16 bayttan çoğuna kadar. Şamandıraları kompakt bir şekilde tutmak için, bunlardan bir 'array.array' kullanabilirsiniz (ama bu liste benzeri, dict-like değil). –