Я пытаюсь отладить проблему памяти с моим большим приложением Python. Большая часть памяти находится в массивах numpy
, управляемых классами Python, поэтому Heapy и т.д. Бесполезны, поскольку они не учитывают память в массивах numpy
, Поэтому я попытался вручную отслеживать использование памяти с помощью монитора активности MacOSX (10.7.5) (или top
, если хотите). Я заметил следующее странное поведение. На обычной интерпретаторной интерпретации python
(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
Независимо от того, что я делаю, объем памяти в сеансе Python никогда не будет ниже 134,9 МБ. Поэтому мой вопрос:
Почему ресурсы массивов размером более 1000x1000x17x8 байт (найденные эмпирически в моей системе) должным образом возвращены системе, а память меньших массивов, похоже, навсегда застряла с интерпретатором Python?
Это, по-видимому, улучшает работу, поскольку в моих реальных приложениях я получаю более 2 ГБ памяти, я никогда не смогу вернуться из интерпретатора Python. Является ли это предполагаемым поведением, что Python резервирует все больше и больше памяти в зависимости от истории использования? Если да, то Activity Monitor так же бесполезен, как Heapy для моего дела. Есть ли что-то, что не бесполезно?