16

大規模な Python アプリケーションでメモリの問題をデバッグしようとしています。ほとんどのメモリはnumpyPython クラスによって管理される配列にあるため、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 が使用履歴に応じてメモリをどんどん予約するのは意図した動作ですか? はいの場合、私の場合、Activity Monitor は Heapy と同じくらい役に立ちません。役に立たないものはありますか?

4

1 に答える 1