2016-07-13 44 views
7

Python multiprocessing modülünü kullanarak birden çok işçiyi kullanan bir yardımcı programım var ve benim istediğim her şeyi yapan mükemmel memory_profiler yardımcı programı aracılığıyla bellek kullanımını izleyebilmeyi istiyorum - özellikle zaman içinde bellek kullanımını örnekleme ve çizim Son sonuç (Bu soru için satır içi bellek profili ile ilgilenmiyorum).Python çoklu işlem ve memory_profiler kullanarak birden çok alt işlem nasıl oluşturulur?

Bu soruyu ayarlamak için , memory_profiler kitaplığında verilen example benzer bellek ayıran bir alt işlevi olan bir komut dosyası, daha basit bir sürümünü oluşturduk. aşağıdaki gibi işçi şu şekildedir:

import time 

X6 = 10 ** 6 
X7 = 10 ** 7 

def worker(num, wait, amt=X6): 
    """ 
    A function that allocates memory over time. 
    """ 
    frame = [] 

    for idx in range(num): 
     frame.extend([1] * amt) 
     time.sleep(wait) 

    del frame 

4 işçi sıralı iş yükünü Verilen:

if __name__ == '__main__': 
    worker(5, 5, X6) 
    worker(5, 2, X7) 
    worker(5, 5, X6) 
    worker(5, 2, X7) 

her işçi çalıştırmak birbiri ardına sahip mprof benim komut profil çalıştırılabilir sürer 70 saniyeler. olarak çalıştırmak komut dosyası, aşağıdaki gibidir: Bu işçiler multiprocessing ile paralel gitmesi Having senaryo yavaş çalışan bir işçi kadar yavaş bitirmek anlamına gelir

Sequential Memory Generating Workers

:

$ mprof run python myscript.py 

aşağıdaki bellek kullanımı grafiği üretir (25 saniye).

import multiprocessing as mp 

if __name__ == '__main__': 
    pool = mp.Pool(processes=4) 
    tasks = [ 
     pool.apply_async(worker, args) for args in 
     [(5, 5, X6), (5, 2, X7), (5, 5, X6), (5, 2, X7)] 
    ] 

    results = [p.get() for p in tasks] 

Bellek profilci gerçekten çalışır, ya da en azından mprof kullanarak hata var ama sonuç garip biraz şunlardır: şu şekildedir: O script

enter image description here

hızlı bir bakış at Etkinlik İzleyicisi, aslında, her bir alt işlem için bir tane olmak üzere, mprof için bir tane olan python myscript.py için bir tane olmak üzere 6 Python işlemi olduğunu gösterir. mprof'un yalnızca python myscript.py işleminin bellek kullanımını ölçtüğü anlaşılıyor.

Python Processes in Activity Monitor

memory_profiler kütüphane

özelleştirilebilir ve ben her işlemin bellek yakalamak ve muhtemelen kütüphanesini kendisi kullanarak günlük dosyaları ayırmak için bunları yazmak gerekir oldukça eminim. Nereden başlayacağımı ya da bu özelleştirme seviyesine nasıl yaklaşacağımı bilmiyorum.

tüm çocuk (çatal) süreçlerin bellek kullanımını özetliyor -C bayrağı keşfetmek did mprof komut dosyası aracılığıyla okuduktan sonra DÜZENLEME

.

Multiprocessing Workers with Include Children Flag

Ama ne aradığım zaman içinde her bir alt sürecin bellek kullanımı tüm işçileri (ve usta) çizmek böylece aşağıdaki gibidir: Bu (çok gelişmiş) grafiğinin yol açar Aynı grafikte. Benim düşüncem memory_usage'un her bir alt işlemine farklı bir günlük dosyasına yazılmalı, sonra görselleştirebiliyorum.

+0

Bu soru, ilgilenen varsa https://github.com/fabianp/memory_profiler/issues/118 adresinden GitHub'daki geliştiricilerle tartışılmaktadır. – bbengfort

cevap

1

Günümüzde, tam olarak bunu yapan bellek profiler kitaplığına yeni bir özellik eklenmiştir. aşağıdaki gibi bu işlevselliği, ilk güncelleme memory_profiler gerekirse:

$ pip install -U memory_profiler 

Bu hafıza Profilcinin v0.44 sürümü yüklemeniz gerekir. Bu durumda olduğunu kontrol etmek için, çalışma eylemi help komutunu kullanın:

mprof run --help 
Usage: mprof run [options] 

Options: 
    --version    show program's version number and exit 
    -h, --help   show this help message and exit 
    --python    Activates extra features when the profiling executable 
         is a Python program (currently: function 
         timestamping.) 
    --nopython   Disables extra features when the profiled executable 
         is a Python program (currently: function 
         timestamping.) 
    -T INTERVAL, --interval=INTERVAL 
         Sampling period (in seconds), defaults to 0.1 
    -C, --include-children 
         Monitors forked processes as well (sum up all process 
         memory) 
    -M, --multiprocess Monitors forked processes creating individual plots 
         for each child 

sonra -M bayrağı görmek gitmek iyiysen!

$ mprof run -M python myscript.py 
$ mprof plot 

Ve şuna benzer bir rakam almalısınız:

Bundan sonra aşağıdaki kodunuzu çalıştırabilir

mprof tracking individual child proccesses

Not olduğunu sen --include-children bayrağı olarak kullanmak durumunda iyi, ana süreç hafızası, aynı zamanda yararlı bir komplo olan tüm çocukların ve ana, toplam bellek kullanımı olacaktır.

+0

@ fabian-pedregosa'ya bu konuda yardımcı olması için özel teşekkürler! – bbengfort

+0

Bu modda zaman damgalarını ve '@ profili 'dekoratörünü etkinleştirmeye ne dersiniz? Mümkün mü? – petroslamb

+0

Zaman damgasını etkinleştirme konusunda ne kastettiğinizden emin değilim? Bu 'profil' dekoratör ile mümkün olmalı, aynı argümanları kullanır düşünüyorum. – bbengfort