2014-02-03 5 views
2

Я хотел бы знать правильный способ освобождения памяти после того, как сюжет сделан, так как я получаю ошибку RuntimeError: Could not allocate memory for image при построении нескольких изображений в цикле.matplotlib: освобождение памяти после завершения графика

В настоящее время я следующие команды в другом коде на якобы сделать только что:

import matplotlib.pyplot as plt 

# The code 
..... 

# Make plot 
fig = plt.figure() 
# Plotting stuff. 
plt.imshow(...) 
plt.plot(...) 
plt.scatter(...) 

# Save plot to file. 
plt.savefig(...) 

# Release memory. 
plt.clf() 
plt.close() 

Комментарий в this answer утверждает, что правильный синтаксис фактически plt.close(fig) но наибольшее количество голосов ответ given here говорит, что plt.clf() достаточно и не упоминается .close.

Вопросы: что является (являются) правильной командой для освобождения памяти после сохранения графика в файл? Нужны ли мне как .clf, так и .close или один из них достаточно?

ответ

2

Я хотел бы предложить вам альтернативный подход. Обратите внимание: imshow возвращает ручку для вас. Возьмите ссылку на это и используйте метод set_data для этого объекта для последующих итераций.

>>> h = plt.imshow(np.zeros([480, 640])) 
>>> h 
<matplotlib.image.AxesImage at 0x47a03d0> 
>>> for img in my_imgs: 
...  h.set_data(img) #etc 
+0

Не могли бы вы немного расширить свой ответ? Что делать, если я не использую 'imshow' на своих участках? Что делает вызов 'set_data'? – Gabriel

+0

Вы не показали, как вы рисуете свои изображения, поэтому 'plt.imshow' был просто образованным предположением. 'set_data' будет обновлять объект AxesImage в этом случае с новыми данными, а не создавать новый объект изображения, который, кажется, дает вам проблемы с памятью. – wim

+0

Спасибо @wim. Я иногда использую 'imshow', но не исключительно. Я также использую 'plt.plot()' и 'plt.scatter()', поэтому я не уверен, как это можно применить к этим случаям, я обновлю вопрос, чтобы сделать это более понятным. – Gabriel

Смежные вопросы