我正在尝试调试我的大型 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 MB。所以我的问题是:
为什么大于 1000x1000x17x8 字节的数组资源(根据经验在我的系统上找到)正确地返回给系统,而较小数组的内存似乎永远被 Python 解释器卡住了?
这似乎确实增加了,因为在我的实际应用程序中,我最终得到了超过 2 GB 的内存,我永远无法从 Python 解释器中取回。这是 Python 根据使用历史保留越来越多内存的预期行为吗?如果是,那么对于我的情况,Activity Monitor 和 Heapy 一样没用。有什么东西不是没用的吗?