2010-04-24 26 views
5

Bazı performanslar elde etmek için python'un çoklu işlem kitaplığını kullanmaya çalışıyorum. Özellikle map işlevini kullanıyorum. Şimdi, herhangi bir sebepten ötürü tek bir iş ortağıyla değiştirdiğimde, yüksek bellek kullanımı elde edemiyorum. Fakat haritanın çok işlemli versiyonunu kullanmak hafızamın çatıdan geçmesine neden oluyor. Kayıt için, hafızayı kolayca doldurabilecek bir şey yapıyorum, ama ikisi arasında ne tür bir fark yaratacak bir fark var?Yüksek bellek kullanımı yalnızca çok işlem yaparken

+0

Kayıt için, bu bellek * kullanım * gibi bir bellek * sızıntısı * gibi gelmiyor. –

+0

Çok doğru, bir kez daha, benim üzerimde kötü ifadeler. – Sandro

cevap

4

Çok işlemcinin iş parçacığı kullanmadığını fark ediyorsunuz, evet? Bunu söylüyorum çünkü "tek bir iş parçacığı" sözünden bahsediyorsun.

Eğer multiprocessing 'ın map aracılığıyla çok fazla veri gönderiyor musunuz? Muhtemel bir neden, seri hale getirme işleminin birçok durumda yapılması gerektiğidir. multiprocessing, pickle kullanır; bu genellikle, asitleme yaptığından daha fazla bellek alır. (Bazı durumlarda, özel olarak map yöntemini çağırdığınızda o yüzden yapamaz mevcut sürecine yeni veri göndermek gerekiyor açıldığında işlem seri önlemek, ancak yeni süreçler oluşturulur fork() sistemlerde.)

yana multiprocessing ile gerçek işin tamamı ayrı işlemlerde yapılır, ana işleminizin belleği gerçekleştirdiğiniz gerçek işlemlerden etkilenmemelidir. Bununla birlikte, belleğin toplam kullanımı biraz artar, çünkü her çalışan işleminde gönderdiğiniz verilerin bir kopyası vardır. Bu, bazen CoW'ye sahip sistemlerde yazma üzerine yazılan bellek (serileştirme ile aynı durumda değil), ancak Python'un bellek kullanımı, bu yazının hızlı bir şekilde yazılacağı ve bu şekilde kopyalanacağı şekildedir.

+0

Doğru, özür dilerim ki çok işlemcinin aslında thread kullanmıyor olduğunu biliyorum. (Bu nedenle isim) Bu yüzden bilgileri boruya göndermek, onu öldüren şeydir. Çok mantıklı. Karşılaştığım soruna herhangi bir çözüm biliyor musunuz? – Sandro

+1

Daha az veri gönder. Ya da, daha küçük parçalar halinde gönderin. Veya fork() ile bir sistem üzerindeyseniz, serileştirme gerçekleşmeyecek şekilde yapın: çoklu işlemenin yeni süreçlere başlayacağından emin olun. –