web-dev-qa-db-ja.com

matplotlibの図を作成した後にメモリを解放するにはどうすればよいですか

いくつかのmatlpotlib関数をいくつかのDjango-celeryタスクにロールインしています。

タスクが呼び出されるたびに、RAMはpython専用です。やがて、pythonはRAMをすべて占有します。

質問:このメモリを解放するにはどうすればよいですか?

更新2-2番目の解決策:

Matplotlibエラーが発生したときにメモリがロックされていることについて同様の質問を具体的に尋ねましたが、この質問に対して良い答えが得られました.clf().close()、およびgc.collect() aren 'マルチプロセスを使用して、プロセスが終了するとメモリが自動的に解放される別のプロセスでプロット関数を実行する場合に必要です。

Matplotlibエラーはメモリリークになります。そのメモリを解放するにはどうすればよいですか?

UPDATE-解決策:

これらのstackoverflowの投稿は、matplotlibオブジェクトが使用したメモリを次のコマンドで解放できることを示唆しています。

.clf()Matplotlibはループでプロットするときにメモリを使い果たします

.close()Python matplotlib:Figureサイズを指定するときにメモリが解放されない

import gc
gc.collect()

ソリューションのテストに使用した例を次に示します。

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import import figure, savefig
import numpy as np
import gc      

a = np.arange(1000000)
b = np.random.randn(1000000)

fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w')
fig.set_size_inches(10,7)
ax = fig.add_subplot(111)
ax.plot(a, b)

fig.clf()
plt.close()
del a, b
gc.collect()
57
sequoia

セロリに関係なく関数がリークしていないことを確認するために、タスク関数を数回(forで)実行しようとしましたか? Django.settings.DEBUGがFalseに設定されていることを確認してください(接続オブジェクトは、DEBUG = Trueの場合、すべてのクエリをメモリに保持します)。

4
Nicolae Dascalu