#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
ondata
может быть полезной. Вероятно, есть дополнительные ссылки на список, хранящийся в других частях jupyter.3. В заголовке и теле по-разному упоминаются Python, IPython и jupyter; у каждого из них будет немного разное поведение памяти. Если вы утверждаете, что это проблема ipython, а не jupyter, то убедитесь, что вы можете воспроизвести ее без запуска jupyter. Аналогично, повторяя Python, а не ipython.
4. В более простом цикле добавления списка
cell1
я получаю ожидаемый цикл памяти (как указано в системном мониторе). Как отмечают другие, разделение проблем OS, python и jupyter / ipython может быть сложным. А интерактивный характер ноутбука означает, что легко перепутать последовательность запусков ячеек.5. Вы также можете использовать магию
whos
, чтобы проверить, какие переменные есть в интерактивном пространстве имен. Существует определенное количество повторного использования памяти; по какой-то сложной логике python / numpy / juypter может выбрать использование освобожденной памяти в будущем.