Czy istnieje sposób, aby program Python określił, ile pamięci aktualnie używa? Widziałem dyskusje na temat wykorzystania pamięci dla pojedynczego obiektu, ale potrzebuję całkowitego zużycia pamięci dla procesu, aby móc określić, kiedy należy rozpocząć odrzucanie buforowanych danych.
python
memory-management
rwallace
źródło
źródło
psutil
jest wieloplatformowy i może zwracać te same wartości, cops
narzędzie wiersza poleceń: pythonhosted.org/psutil/#psutil.Process.memory_infopsutil
) obecnie obsługuje systemy Linux, Windows, OSX, FreeBSD i Sun Solaris, zarówno 32-bitowe, jak i 64-bitowe architektury, w wersjach Python od 2.6 do 3.4” z Dokumentacjipsutil
,psutil.Process()
jest równoważnepsutil.Process(os.getpid())
. To jedna mniejsza rzecz, o której musisz pamiętać.W systemach opartych na Uniksie (Linux, Mac OS X, Solaris) możesz użyć
getrusage()
funkcji ze standardowego modułu bibliotecznegoresource
. Wynikowy obiekt ma atrybutru_maxrss
, który daje maksymalne użycie pamięci dla procesu wywołującego:Dokumenty Pythona nie odnotowują jednostek. Sprawdź stronę swojego systemu,
man getrusage.2
aby sprawdzić wartość urządzenia. W systemie Ubuntu 18.04 jednostka jest zapisana w kilobajtach. W systemie Mac OS X są to bajty.getrusage()
Funkcja może być także stosowanyresource.RUSAGE_CHILDREN
w celu uzyskania serwera dla procesów potomnych, a (na niektórych systemach)resource.RUSAGE_BOTH
dla całkowitej (ja i dziecko) Wykorzystanie procesu.Jeśli zależy Ci tylko na Linuksie, możesz alternatywnie przeczytać plik
/proc/self/status
lub/proc/self/statm
, jak opisano w innych odpowiedziach na to i to pytanie .źródło
W systemie Windows możesz korzystać z WMI ( strona główna , sklep z serami ):
W systemie Linux (z książki kucharskiej Python http://code.activestate.com/recipes/286222/ :
źródło
return int(result[0].WorkingSet)
W systemie Unix możesz użyć tego
ps
narzędzia do monitorowania:gdzie 1347 to jakiś identyfikator procesu. Wynik jest także w MB.
źródło
Bieżące użycie pamięci przez bieżący proces w systemie Linux dla Python 2 , Python 3 i pypy , bez żadnych importów:
Odczytuje plik statusu bieżącego procesu, bierze wszystko po
VmRSS:
, następnie bierze wszystko przed pierwszą nową linią (izolując wartość VmRSS), a na koniec odcina ostatnie 3 bajty, które są spacją i jednostką (kB).Aby zwrócić, usuwa wszelkie białe znaki i zwraca jako liczbę.
Testowany na Linuksie 4.4 i 4.9, ale nawet wczesna wersja Linuksa powinna działać: wyszukiwanie
man proc
i wyszukiwanie informacji w/proc/$PID/status
pliku, wspomina o minimalnych wersjach dla niektórych pól (jak Linux 2.6.10 dla „VmPTE”), ale „VmRSS „w polu (którego tu używam) nie ma takiej wzmianki. Dlatego zakładam, że istnieje tam od wczesnej wersji.źródło
Podoba mi się , dziękuję za @bayer. Teraz mam specjalne narzędzie do liczenia procesów.
Załącz moją listę procesów.
Odniesienie
źródło
ps aux | awk '/python/{sum+=$6}; END {print sum/1024 " MB"}'
W przypadku Python 3.6 i psutil 5.4.5 łatwiej jest korzystać z
memory_percent()
funkcji wymienionych tutaj .źródło
Jeszcze łatwiejsze w użyciu niż
/proc/self/status
:/proc/self/statm
. To tylko rozdzielona spacjami lista kilku statystyk . Nie byłem w stanie stwierdzić, czy oba pliki są zawsze obecne.Oto prosty przykład:
To tworzy listę, która wygląda mniej więcej tak:
Widać, że przeskakuje o około 300 000 bajtów po około 3 przydziałach 100 000 bajtów.
źródło
Poniżej mój dekorator funkcji, który pozwala śledzić, ile pamięci ten proces zużył przed wywołaniem funkcji, ile pamięci zużywa po wywołaniu funkcji i jak długo funkcja jest wykonywana.
Więc kiedy masz jakąś funkcję ozdobioną tym
Będziesz mógł zobaczyć ten wynik:
źródło
źródło
Komenda dla systemów uniksowych
time
(/ usr / bin / time) podaje te informacje, jeśli przejdziesz -v. ZobaczMaximum resident set size
poniżej, jaka jest maksymalna (szczytowa) rzeczywista (nie wirtualna) pamięć, która została użyta podczas wykonywania programu :źródło
time
zamiast/usr/bin/time
. Patrz: askubuntu.com/questions/434289/…Używanie sh i os, aby dostać się do odpowiedzi Pythona Bayera.
Odpowiedź jest w megabajtach.
źródło