Wird das Freigeben für kleine / große Numpy-Arrays unterschiedlich gehandhabt?

Ich versuche, ein Speicherproblem mit meiner großen Python-Anwendung zu beheben. Der größte Teil der Erinnerung ist innumpy Arrays, die von Python-Klassen verwaltet werden, alsoHeapy etc. sind unbrauchbar, da sie den Speicher in der nicht berücksichtigennumpy Arrays. Daher habe ich versucht, die Speichernutzung mit dem MacOSX (10.7.5) Activity Monitor (oder manuell zu verfolgentop wenn man so will). Ich bemerkte das folgende seltsame Verhalten. Normalerweisepython Interpreter-Shell (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

Egal was ich mache, der Speicherbedarf der Python-Sitzung wird nie wieder unter 134,9 MB fallen. Meine Frage lautet also:

Warum werden die Ressourcen von Arrays, die größer als 1000x1000x17x8 Bytes sind (empirisch auf meinem System gefunden), ordnungsgemäß an das System zurückgegeben, während der Speicher kleinerer Arrays für immer mit dem Python-Interpreter verbunden zu sein scheint?

Dies scheint zu scheitern, da ich in meinen realen Anwendungen am Ende über 2 GB Speicher habe, den ich niemals vom Python-Interpreter zurückbekommen kann. Ist das beabsichtigte Verhalten, dass Python abhängig vom Nutzungsverlauf immer mehr Speicher reserviert? Wenn ja, ist Activity Monitor für meinen Fall genauso nutzlos wie Heapy. Gibt es irgendetwas, das nicht nutzlos ist?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage