Ошибки Matplotlib приводят к утечке памяти.Как я могу освободить эту память? - PullRequest
11 голосов
/ 19 августа 2011

Я запускаю приложение django, которое включает в себя matplotlib и позволяет пользователю указывать оси графика. Это может привести к «Ошибка переполнения: сложность Agg превышена»

Когда это происходит, до 100 МБ ОЗУ связываются. Обычно я освобождаю эту память, используя fig.gcf(), plot.close() и gc.collect(), но память, связанная с ошибкой, похоже, не связана с объектом сюжета.

Кто-нибудь знает, как я могу освободить эту память?

Спасибо.

Вот код, который выдает мне ошибку Agg Complexity Error.

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
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.savefig('yourdesktop/random.png')   # code gives me an error here

fig.clf()    # normally I use these lines to release the memory
plt.close()
del a, b
gc.collect()

Ответы [ 2 ]

12 голосов
/ 19 августа 2011

Полагаю, вы можете запустить код, который вы разместили, хотя бы один раз.Проблема проявляется только после многократного запуска выложенного кода.Правильно?

Если это так, следующее позволяет избежать проблемы, не идентифицируя источник проблемы.Возможно, это плохо, но это работает в крайнем случае: просто используйте multiprocessing для запуска кода, интенсивно использующего память, в отдельном процессе.Вам не нужно беспокоиться о fig.clf() или plt.close() или del a,b или gc.collect().Вся память освобождается по окончании процесса.

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np      

import multiprocessing as mp

def worker():
    N=1000000
    a = np.arange(N)
    b = np.random.randn(N)

    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.savefig('/tmp/random.png')   # code gives me an error here

if __name__=='__main__':
    proc=mp.Process(target=worker)
    proc.daemon=True
    proc.start()
    proc.join()

Вам также не нужно proc.join().join будет блокировать основной процесс до завершения worker.Если вы опустите join, то основной процесс просто продолжится, а worker будет работать в фоновом режиме.

11 голосов
/ 06 сентября 2012

я нахожу здесь http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg11809.html , это дает интересный ответ, который может помочь

попробуйте заменить:

import matplotlib.pyplot as plt
fig = plt.figure()

с

from matplotlib import figure
fig = figure.Figure()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...