1. ホーム
  2. python

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

2023-08-12 15:58:38

質問

いくつかのdjango-celeryタスクに、いくつかのmatlpotlibの関数を組み込んでいます。

タスクが呼び出されるたびに、より多くの RAM が python に割かれます。あまり時間が経たないうちに、python はすべての RAM を占有してしまいます。

QUESTION。 このメモリを解放するにはどうしたらよいでしょうか?

UPDATE 2 - 第二の解決策。

matplotlibのエラー時にメモリがロックされることについて具体的に同様の質問をしたのですが、この質問に対して良い回答が得られました .clf() , .close() そして gc.collect() は、プロセスが終了すると自動的にメモリが解放される別のプロセスでプロット機能を実行するために、マルチプロセスを使用する場合は必要ありません。

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

UPDATE - 解決策です。

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

.clf() : Matplotlib がループで描画するときにメモリ不足になる

.close() : Python matplotlib: 図形の大きさを指定したときにメモリが解放されない

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()

どのように解決するのですか?

タスク関数を何度か (for で) 実行して、celery に関係なく関数がリークしていないことを確認しましたか? django.settings.DEBUG が False になっていることを確認してください (DEBUG=True のとき、接続オブジェクトは全てのクエリーをメモリに保持します)。