Утечка памяти в Jupyter-Notebook с Anaconda 5.1.0 или новее при использовании matplotlib - PullRequest
0 голосов
/ 19 февраля 2019

Я использовал ноутбук Jupyter с последней версией Anaconda (2018.12) и заметил, что он использует огромный объем памяти (около 6 ГБ) для печати и непосредственного сохранения ~ 2000 рисунков (1920x1080) в файлы .png в Ubuntu 18.04.

Я попытался воспроизвести эту проблему на своем Mac с помощью Anaconda 4.4.0, но проблема не возникла.

Позже я попытался установить несколько разных версий Anaconda на свой компьютер с Ubuntu.и успешно воспроизвести проблему утечки памяти с помощью более простого кода.

Оказалось, что Anaconda 5.0.0 является последней версией, которая не имеет этой конкретной проблемы утечки памяти.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1,101)
n = 0
dt = 0.01
w = 1

while n <= 1000:
    y = np.sin(2*np.pi*x + w*n*dt)
    plt.clf()
    plt.title("T = %.02f s." %(n*dt))
    plt.plot(x,y)
    plt.savefig("dat/dat_%05d.png" % (n))
    plt.close()
    n = n+1

Iя использую htop для мониторинга использования памяти.

В Anaconda 5.0.0 он показывает постоянное 1,3% использования памяти на моей машине с 8 ГБ ОЗУ.

В Anaconda 5.1.0использование памяти начинается примерно с 2% и быстро увеличивается, поскольку оно сохраняет графики в файлы .png, достигает 16% использования памяти и остается тем же даже после выполнения ячейкиРабота завершена.

Я пытался использовать

import gc
gc.collect()

, и использование памяти немного уменьшилось до 12%.

И, конечно, использование памятиЯ имею в виду использование памяти только этим конкретным процессом python, а не использование всей системы.

Кто-нибудь уже успешно разрешил эту проблему утечки памяти в jupyter-notebook, включенном в последнюю версию Anaconda?

1 Ответ

0 голосов
/ 19 февраля 2019

Сброс переменной y каждый цикл while - это плохая форма, потому что оригинальный объект где-то все еще находится в памяти, просто у него больше нет ссылки на него.Вы можете использовать del y в конце каждого цикла while перед оператором n = n+1, но ТАКЖЕ ТАКЖЕ не освобождает его из памяти ... он просто сидит до тех пор, пока сборщик мусора Python не доберется до него.Возможно, добавление этой строки может освободить память немного быстрее.

Я предполагаю, что вы видели это: https://www.quora.com/Why-doesnt-Python-release-the-memory-when-I-delete-a-large-object

Возможно, вы быстрее создадите сюжет меньшими порциями из-за проблемы со сборкой мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...