Chcę poznać wykorzystanie pamięci przez moją aplikację Python, a konkretnie chcę wiedzieć, które bloki / części kodu lub obiekty zużywają najwięcej pamięci. Wyszukiwarka Google pokazuje, że komercyjnym jest Python Memory Validator (tylko Windows).
A te open source to PySizer i Heapy .
Nie próbowałem nikogo, więc chciałem wiedzieć, który jest najlepszy, biorąc pod uwagę:
Podaje większość szczegółów.
Muszę wprowadzać lub nie wprowadzać żadnych zmian w kodzie.
python
performance
memory-management
profiling
Anurag Uniyal
źródło
źródło
Odpowiedzi:
Heapy jest dość prosty w użyciu. W pewnym momencie kodu musisz napisać:
Daje to trochę takich wyników:
Możesz również dowiedzieć się, skąd się odwołują obiekty i uzyskać statystyki na ten temat, ale dokumenty na ten temat są nieco rzadkie.
Istnieje również przeglądarka graficzna napisana w Tk.
źródło
pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
boost::python
przedmiotów, dobrze byłoby zobaczyć kilka przykładów!Ponieważ nikt o tym nie wspominał, wskażę mój moduł memory_profiler, który jest w stanie drukować raport liniowy po zużyciu pamięci i działa na systemach Unix i Windows (na tym ostatnim wymaga psutil). Dane wyjściowe nie są bardzo szczegółowe, ale ich celem jest przegląd sytuacji, w której kod zużywa więcej pamięci, a nie wyczerpująca analiza przydzielonych obiektów.
Po udekorowaniu funkcji
@profile
i uruchomieniu kodu z-m memory_profiler
flagą, wydrukuje on raport wiersz po wierszu w następujący sposób:źródło
memory_profiler
buforuje dane wyjściowe? Mogę robić coś złego, ale wydaje się, że zamiast zrzucić profil funkcji po jej zakończeniu, czeka na zakończenie skryptu.Polecam Dowser . Jest bardzo łatwy w konfiguracji i nie wymaga żadnych zmian w kodzie. Możesz przeglądać liczbę obiektów każdego typu w czasie, przeglądać listę obiektów aktywnych, przeglądać odniesienia do obiektów aktywnych, wszystko z prostego interfejsu internetowego.
Importujesz memdebug i wywołujesz memdebug.start. To wszystko.
Nie próbowałem PySizer ani Heapy. Byłbym wdzięczny za recenzje innych.
AKTUALIZACJA
Powyższy kod jest
CherryPy 2.X
, metoda została usunięta i nie bierze flagę. Więc jeśli używaszCherryPy 3.X
server.quickstart
engine.start
blocking
CherryPy 3.X
źródło
Rozważmy bibliotekę objgraph (patrzhttp://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks na przykładowy przypadek użycia).
źródło
objgraph.by_type('dict')
zrozumieć, skąddict
pochodzą te wszystkie nieoczekiwane obiekty.Muppy to (jeszcze jeden) Profiler wykorzystania pamięci dla Pythona. Ten zestaw narzędzi koncentruje się na identyfikacji wycieków pamięci.
Muppy stara się pomóc programistom w wykrywaniu wycieków pamięci Python w aplikacjach. Umożliwia śledzenie zużycia pamięci podczas działania i identyfikację przeciekających obiektów. Dodatkowo dostarczane są narzędzia, które pozwalają zlokalizować źródło nie zwolnionych obiektów.
źródło
Tworzę profiler pamięci dla Pythona o nazwie memprof:
http://jmdana.github.io/memprof/
Umożliwia rejestrowanie i wykreślanie zużycia pamięci przez zmienne podczas wykonywania udekorowanych metod. Musisz tylko zaimportować bibliotekę, używając:
I udekoruj swoją metodę za pomocą:
To jest przykład tego, jak wyglądają wykresy:
Projekt jest hostowany w GitHub:
https://github.com/jmdana/memprof
źródło
a
,b
ic
są nazwy zmiennych. Dokumentację można znaleźć na stronie github.com/jmdana/memprof . Jeśli masz jakieś pytania, prosimy o przesłanie problemu w github lub wysłanie wiadomości e-mail na listę mailingową, która znajduje się w dokumentacji.Odkryłem, że meliae są znacznie bardziej funkcjonalne niż Heapy lub PySizer. Jeśli zdarzyło Ci się uruchamiać aplikację internetową WSGI, to Dozer to fajne opakowanie oprogramowania pośredniego programu Dowser
źródło
Wypróbuj również projekt pytracemalloc, który zapewnia użycie pamięci dla numeru linii w Pythonie.
EDYCJA (2014/04): Ma teraz GUI Qt do analizy migawek.
źródło
tracemalloc
jest teraz częścią standardowej biblioteki Pythona. Zobacz docs.python.org/3/library/tracemalloc.html