2016-12-06 19 views
7

Mam kilka (prawie dziesięć) GB pamięci pobranej przez jądro ipython. Myślę, że to pochodzi z dużych obiektów (macierzy, list, numpy tablic, ...), które mogłem wyprodukować podczas jakiejś operacji i teraz już nie potrzebuję.lista użycia pamięci w ipython i jupyter

Chciałbym wykaz wszystkich obiektów Mam zdefiniowane i sortować je ich ślad w pamięci. Czy istnieje prosty sposób na zrobienie tego? Dla niektórych typów istnieje metoda nbytes, ale nie dla wszystkich ... dlatego szukam ogólnego sposobu na wylistowanie wszystkich wykonanych obiektów i ich zajętości pamięci.

+0

'import sys; posortowane ([(x, sys.getsizeof (x)) dla x w dir()], key = lambda x: x [1], reverse = True) '? – Abdou

+0

Możliwy duplikat [Jak mogę sprawdzić wykorzystanie pamięci obiektów w iPythonie?] (Http://stackoverflow.com/questions/563840/how-can-i-check-the-memory-usage-of-objects-in -ipython) – amin

+1

Nie duplikat, pyta, jak znaleźć przedmioty, których nie zna. @ Na pewno powinieneś zrobić taką odpowiedź. –

Odpowiedz

15

Zakładając, że używasz ipython lub jupyter, trzeba będzie zrobić trochę pracy, aby uzyskać listę wszystkich obiektów ty zdefiniowanych. Oznacza to odebranie wszystkiego pod globals() i odfiltrowanie obiektów, które są modules, builtins, ipython objects itd. Po upewnieniu się, że masz te obiekty, możesz przechwycić ich rozmiary za pomocą sys.getsizeof. Można to podsumować w następujący sposób:

import sys 

# These are the usual ipython objects, including this one you are creating 
ipython_vars = ['In', 'Out', 'exit', 'quit', 'get_ipython', 'ipython_vars'] 

# Get a sorted list of the objects and their sizes 
sorted([(x, sys.getsizeof(globals().get(x))) for x in dir() if not x.startswith('_') and x not in sys.modules and x not in ipython_vars], key=lambda x: x[1], reverse=True) 

Proszę pamiętać, że w przypadku obiektów Pythona (te tworzone z funkcji wbudowanych Pythona), sys.getsizeof będą bardzo dokładne. Może to jednak być niedokładne w przypadku obiektów tworzonych za pomocą bibliotek innych firm. Ponadto, należy pamiętać, że sys.getsizeof dodaje dodatkowy narzut na śmieci, jeśli obiekt jest zarządzany przez garbage collector. Niektóre rzeczy mogą wyglądać na nieco cięższe niż w rzeczywistości.

Na marginesie, metoda numpy może być nieco myląca, ponieważ nie obejmuje pamięci zużywanej przez elementy inne niż element obiektu tablicy.

Mam nadzieję, że to pomoże.