Huella de memoria de Python vs. tamaño de pila
Estoy teniendo algunos problemas de memoria mientras uso un script de Python para emitir una gransolr consulta. Estoy usando elsolrpy biblioteca para interactuar con el servidor solr. La consulta devuelve aproximadamente 80,000 registros. Inmediatamente después de emitir la consulta, la huella de memoria de python se ve a través de los globos superiores a ~ 190MB.
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
...
En este punto, el perfil de montón visto a través de heap se ve así:
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
...
Los objetos Unicode representan los identificadores únicos de los registros de la consulta. Una cosa a tener en cuenta es que el tamaño total del montón es de solo 14 MB, mientras que Python ocupa 190 MB de memoria física. Una vez que la variable que almacena los resultados de la consulta queda fuera del alcance, el perfil de pila refleja correctamente la recolección de basura:
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
Sin embargo, la huella de memoria permanece sin cambios:
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
...
¿Por qué hay una disparidad tan grande entre la huella de memoria física de python y el tamaño del montón de python?