4

matplotlib.imshowでメモリリークを特定しました。私は同様の質問(Matplotlib imshowでの過度のメモリ使用量など)を認識しており、関連するironpythonスレッド(https://github.com/ipython/ipython/issues/1623/)を読みました。

以下のコードは(メモリリークがない場合)実行中に一定量のメモリを消費するはずだと思います。代わりに、反復ごとに大きくなります。

見つけた最新バージョン(matplotlib-1.2.0rc3.win32-py2.7およびnumpy-1.7.0.win32-py2.7)を実行していますが、問題は解決していません。私はimshowの戻り値を保持しておらず、実際には明示的に削除しているので、IronPythonの説明の注記は当てはまらないと思います。動作は、ループ内での明示的な割り当てと削除の有無にかかわらず同じです。

matplotlib-1.2.0.win32-py2.7でも同じ動作が見られます。

各反復は、イメージに必要なメモリにかかっているようです。各画像のサイズを興味深いものにするために、大きな(1024x1024)ランダム行列を選択しました。

Win7 proを2Gの物理RAM、32ビットのpython2.7.3(したがって、メモリエラー)、および上記のnumpyパッケージとmatplotlibパッケージで実行しています。以下のコードは、反復440程度でメモリエラーが発生して失敗します。Windowsタスクマネージャーは、失敗したときに1,860,232Kの消費を報告します。

リークを示すコードは次のとおりです。

IMAGE_SIZE = 1024
import random
RANDOM_MATRIX = []
for i in range(IMAGE_SIZE):
    RANDOM_MATRIX.append([random.randint(0, 100) for each in range(IMAGE_SIZE)])

def exercise(aMatrix, aCount):
    for i in range(aCount):
        anImage = imshow(aMatrix, origin='lower left', vmin=0, vmax=100)
        del(anImage)

if __name__=='__main__':
    from pylab import *
    exercise(RANDOM_MATRIX, 4096)

おそらく、matplotlibの代わりにPILを使用して画像をレンダリングできます。回避策がない場合、これはmatplotlibのショーストッパーだと思います。

4

2 に答える 2

0

回避策を見つけたと思いますが、 imshow がどれほど重いかを完全には理解していませんでした。

答えは、imshow を 1 回だけ呼び出してから、後続の各画像に対して RANDOM_MATRIX を指定して set_data を呼び出すことです。

問題が解決しました!

于 2013-03-11T18:42:08.360 に答える