Это утечка памяти в python / jupyter?

#python #ipython #jupyter

#python #ipython #jupyter

Вопрос:

Я сделал очень простой код на python, который я запускаю на jupyter:

 # Cell 1
data = []
with open('test.txt', mode='r') as f:
    for line in f:
        data.append(line)
  

Файл ‘test.txt «имеет 3,1 Гб, и я могу отслеживать загрузку памяти.

После этого в следующей ячейке я исключаю это:

 # Cell 2
del data
  

Но использование памяти не возвращается в исходное состояние.

Следующее изображение — мой системный монитор. Я выполнил ячейку с исключением переменной, как только закончил загрузку, которая достигла почти 80%. Но память вернулась только после того, как я прервал ядро ноутбука.

введите описание изображения здесь

Разве это не так? Я думаю, что память должна была быть выпущена даже на jupiter, не так ли?

Моя система — Ubuntu 18.04, и я использую miniconda с Python 3.7.7.

Комментарии:

1. Я думаю, что это IPython, который вызывает это. Он хранит запись всего, что вы оцениваете в dict Out .

2. Проверка результата gc.get_referrers on data может быть полезной. Вероятно, есть дополнительные ссылки на список, хранящийся в других частях jupyter.

3. В заголовке и теле по-разному упоминаются Python, IPython и jupyter; у каждого из них будет немного разное поведение памяти. Если вы утверждаете, что это проблема ipython, а не jupyter, то убедитесь, что вы можете воспроизвести ее без запуска jupyter. Аналогично, повторяя Python, а не ipython.

4. В более простом цикле добавления списка cell1 я получаю ожидаемый цикл памяти (как указано в системном мониторе). Как отмечают другие, разделение проблем OS, python и jupyter / ipython может быть сложным. А интерактивный характер ноутбука означает, что легко перепутать последовательность запусков ячеек.

5. Вы также можете использовать магию whos , чтобы проверить, какие переменные есть в интерактивном пространстве имен. Существует определенное количество повторного использования памяти; по какой-то сложной логике python / numpy / juypter может выбрать использование освобожденной памяти в будущем.