¿La liberación se maneja de manera diferente para arreglos de grandes y pequeños números?

Estoy intentando depurar un problema de memoria con mi gran aplicación Python. La mayor parte de la memoria está ennumpy matrices gestionadas por clases de Python, por lo queHeapy Son inútiles, ya que no tienen en cuenta la memoria en elnumpy matrices Así que traté de rastrear manualmente el uso de la memoria usando el Monitor de actividad de MacOSX (10.7.5) (otop Si tu quieres). Noté el siguiente comportamiento extraño. En un normalpython shell intérprete (2.7.3):

import numpy as np # 1.7.1
# Activity Monitor: 12.8 MB
a = np.zeros((1000, 1000, 17)) # a "large" array
# 142.5 MB
del a
# 12.8 MB (so far so good, the array got freed)
a = np.zeros((1000, 1000, 16)) # a "small" array
# 134.9 MB
del a
# 134.9 MB (the system didn't get back the memory)
import gc
gc.collect()
# 134.9 MB

No importa lo que haga, la huella de memoria de la sesión de Python nunca volverá a bajar de 134.9 MB. Así que mi pregunta es:

¿Por qué los recursos de las matrices de más de 1000x1000x17x8 bytes (que se encuentran empíricamente en mi sistema) se devuelven correctamente al sistema, mientras que la memoria de las matrices más pequeñas parece estar pegada al intérprete de Python para siempre?

Esto parece aumentar, ya que en mis aplicaciones del mundo real, acabo con más de 2 GB de memoria que nunca puedo recuperar del intérprete de Python. ¿Es este comportamiento previsto que Python reserva más y más memoria dependiendo del historial de uso? Si es así, entonces el Monitor de Actividad es tan inútil como Heapy para mi caso. ¿Hay algo por ahí que no sea inútil?

Respuestas a la pregunta(1)

Su respuesta a la pregunta