Полагаю, вы можете запустить код, который вы разместили, хотя бы один раз.Проблема проявляется только после многократного запуска выложенного кода.Правильно?
Если это так, следующее позволяет избежать проблемы, не идентифицируя источник проблемы.Возможно, это плохо, но это работает в крайнем случае: просто используйте 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
будет работать в фоновом режиме.