2013-07-02 12 views
6

Interesuje mnie, aby dowiedzieć się o zwiększeniu całkowitej wielkości sterty Pythona, gdy załadowany jest duży obiekt. heapy wydaje się być tym, czego potrzebuję, ale nie rozumiem wyników.Pomiar wzrostu wielkości sterty po wczytaniu dużego obiektu

Mam plik pikla 350 MB z pandą DataFrame w nim, który zawiera około 2,5 miliona wpisów. Kiedy ładuję plik i sprawdzam stertę za pomocą heapy, raportuje, że tylko około 8 MB obiektów zostało dodanych do sterty.

import guppy 
h = guppy.hpy() 
h.setrelheap() 
df = pickle.load(open('test-df.pickle')) 
h.heap() 

To daje następujący wynik:

Partition of a set of 95278 objects. Total size = 8694448 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 44700 47 4445944 51 4445944 51 str 
    1 25595 27 1056560 12 5502504 63 tuple 
    2 6935 7 499320 6 6001824 69 types.CodeType 
... 

Co mnie niepokoi jest Total size z 8694448 bytes. To tylko 8 MB.

Dlaczego Total size nie odzwierciedla rozmiaru całego obiektu DataFramedf?

(Używanie Pythona 2.7.3, heapy 0.1.10, Linux 3.2.0-48-generic-PAE (Ubuntu), i686)

Odpowiedz

0

można spróbować pympler, który pracował dla mnie ostatni raz sprawdzone . Jeśli interesuje Cię całkowity wzrost pamięci, a nie konkretnej klasy, możesz wykonać wywołanie specyficzne dla systemu operacyjnego, aby uzyskać całkowitą pamięć. Np. W systemie operacyjnym opartym na systemie Unix możesz zrobić coś takiego jak przed i po załadowaniu obiektu, aby uzyskać różnicę.

resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 
+0

Dzięki za odpowiedź. Nie udało mi się jeszcze wypróbować pymplera - wypróbuję go w ciągu najbliższych kilku dni. Widok systemu operacyjnego na pamięć nie jest tym, co mnie interesuje, więc funkcja getrusage() nie pomoże w moim przypadku. – rodion

0

miałem podobny problem, kiedy próbuje dowiedzieć się, dlaczego moi 500 MB plików CSV brali do 5 GB pamięci. Panda jest zbudowana na bazie Numpy'ego i dlatego używa C malloc do przydzielenia przestrzeni. Dlatego nie pojawia się w heapy, która profiluje tylko czyste obiekty Pythona. Jednym z rozwiązań może być zajrzenie do valgrind, aby wyśledzić wycieki pamięci.

Powiązane problemy