2011-05-24 22 views
8

Benim python programım meraklı bir performans davranışına sahiptir: Ne kadar uzun olursa, o kadar yavaş olur. Daha önce, dakikada onlarca iş biriminden dışarı çıkar. Bir saat sonra iş birimi başına onlarca dakika alıyor. Şüphelerim bunun sıkışık bir çöp toplayıcı tarafından yapılmasıdır.Çöp toplayıcının ne kadar zaman kullandığını?

Yakalama, komut dosyamın büyük işler için cProfile çalışması için fazla bellek açmasıdır. (bakınız: cProfile taking a lot of memory)

Kendi performans eklentimizi yazdık ve sistemimizin çoğunu gözlemleyebiliyoruz ve bunların hiçbiri problem gibi görünmüyor. Hala çevrilmemiş olan bir kaya GC'dir.

GC'ye ne kadar zaman geçtiğini görmek için başka bir yol var mı (profil veya cProfile yanında)? Python'da, çoğu çöp referans sayımı kullanılarak toplanır.

cevap

6

Biri bunun hızlı ve acısız olmasını bekler ve bunun peşinde olduğunuza benzemez. Sadece döngüsel referanslar için kullanılan gc modülü tarafından atıfta bulunulan koleksiyoncu hakkında soru soruyorsunuz.

kullanım olabilir birkaç şey vardır: zaman çöp toplayıcısı doğrudan yöntem olacaksa görünmüyor rağmen http://docs.python.org/library/gc.html

, sen ayıklamayı etkinleştirmek, açık ve kapalı açabilirsiniz, Koleksiyona bakma vb. Tüm bunlar sizin görevinizde yardımcı olabilir.

Örneğin benim sistemde geçen sürenin dışında gc baskılar hata ayıklama bayrakları açarsanız:

In [1]: import gc 

In [2]: gc.set_debug(gc.DEBUG_STATS) 

In [3]: gc.collect() 
gc: collecting generation 2... 
gc: objects in each generation: 159 2655 7538 
gc: done, 10 unreachable, 0 uncollectable, 0.0020s elapsed. 

kenara Tüm bu, ben bakardım ilk şey bellek kullanımı evrimi programınız çalışır. Bir olasılık, sadece mevcut fiziksel RAM sınırına ulaşması ve çöp toplayıcı ile ilgili bir şeyden ziyade aşırı sayfa hataları nedeniyle yavaşlamasıdır.

+0

Evet, bunun farkındayım. Bana GC'nin ne kadar çok uğraştığını anlatabilirler, ama acil sorunlarım bellek değil, işlemci döngüleri ile ilgili. Eğer GC'nin kullandığı * zamanın * veya * kaç kez * kaçının * çalıştığını söyleyebilirseniz, bu yararlı olabilir. –

+0

@Matthew: İşleminizin gc.collect() işlevini çağırmasına yardımcı olur ve ne kadar sürede dönmesi gerekir? –

+0

@Thomas K, bu bana tek bir koleksiyonun ne kadar sürdüğünü söyler, ancak koleksiyonerin ne sıklıkla çalıştığını söyler. Sahip olduğum diğer veriler göz önüne alındığında, GC'nin sistem çalışırken daha sık ve daha az etkilendiğinden şüpheleniyorum. –

İlgili konular