Wielkość pamięci Pythona a wielkość sterty
Mam problemy z pamięcią podczas używania skryptu Pythona do wydawania dużychsolr pytanie. Używamsolrpy biblioteka do współpracy z serwerem solr. Zapytanie zwraca około 80 000 rekordów. Natychmiast po wydaniu zapytania ślad pamięci Pythona w widoku górnych balonów do ~ 190 MB.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8225 root 16 0 193m 189m 3272 S 0.0 11.2 0:11.31 python
...
W tym momencie profil sterty widziany przez heapy wygląda tak:
Partition of a set of 163934 objects. Total size = 14157888 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 80472 49 7401384 52 7401384 52 unicode
1 44923 27 3315928 23 10717312 76 str
...
Obiekty unicode reprezentują unikalne identyfikatory rekordów z zapytania. Należy zauważyć, że całkowita wielkość sterty to tylko 14 MB, podczas gdy python zajmuje 190 MB pamięci fizycznej. Gdy zmienna przechowująca wyniki kwerendy wypadnie poza zasięgiem, profil sterty poprawnie odzwierciedla zbieranie śmieci:
Partition of a set of 83586 objects. Total size = 6437744 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 44928 54 3316108 52 3316108 52 str
Jednak ślad pamięci pozostaje niezmieniony:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8225 root 16 0 195m 192m 3432 S 0.0 11.3 0:13.46 python
...
Dlaczego istnieje tak duża rozbieżność między śladem pamięci fizycznej pytona a rozmiarem stosu pytonów?