Jupyter Notebook Управление памятью - PullRequest
5 голосов
/ 27 февраля 2020

В настоящее время я работаю над ноутбуком Jupyter в Kaggle. После выполнения желаемых преобразований в моем массиве numpy я протравил его, чтобы он мог быть сохранен на диске. Причина, по которой я это сделал, заключается в том, чтобы я мог освободить память, занятую большим массивом.

Объем памяти, использованный после выборки массива, составил около 8,7 ГБ.

Я решил запустить этот фрагмент кода, предоставленный @ jan-glx здесь , чтобы узнать, какие переменные потребляют мою память:

import sys

def sizeof_fmt(num, suffix='B'):
    ''' by Fred Cirera,  https://stackoverflow.com/a/1094933/1870254, modified'''
    for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:
        if abs(num) < 1024.0:
            return "%3.1f %s%s" % (num, unit, suffix)
        num /= 1024.0
    return "%.1f %s%s" % (num, 'Yi', suffix)

for name, size in sorted(((name, sys.getsizeof(value)) for name, value in locals().items()),
                         key= lambda x: -x[1])[:10]:
    print("{:>30}: {:>8}".format(name, sizeof_fmt(size)))

После выполнения этого шага Я заметил, что размер моего массива составлял 3,3 ГБ, а размер всех остальных переменных, суммируемых вместе, составлял около 0,1 ГБ.

Я решил удалить массив и посмотреть, решит ли это проблему, выполнив следующее:

del my_array
gc.collect()

После этого потребление памяти уменьшилось с 8,7 до 5,4 ГБ. Что в теории имеет смысл, но все же не объясняет, чем занималась остальная часть памяти.

Я решил продолжить в любом случае и сбросить все мои переменные, чтобы посмотреть, освободит ли это память или нет:

%reset

Как и ожидалось, это освободило память от переменных, которые были распечатанный в функции выше, и у меня все еще оставалось 5,3 ГБ памяти.

Одна вещь, на которую стоит обратить внимание, - это то, что я заметил скачок памяти при извлечении самого файла, так что краткое описание процесса быть примерно таким:

  1. выполненные операции с массивом -> потребление памяти увеличилось с 1,9 ГБ до 5,6 ГБ
  2. файл с маринованными файлами -> потребление памяти увеличилось с 5,6 ГБ до 8,7 ГБ
  3. Память внезапно скачет, когда файл обрабатывается до 15,2 ГБ, затем уменьшается до 8,7 ГБ.
  4. Удаленный массив -> потребление памяти уменьшилось с 8,7 ГБ до 5,4 ГБ
  5. выполнено сброс -> потребление памяти уменьшилось с 5,4 ГБ до 5,3 ГБ

Обратите внимание, что вышеприведенное основано на контроле памяти на kaggl е и может быть неточным. Я также проверил этот вопрос , но это не помогло в моем случае.

Будет ли это считаться утечкой памяти? Если так, что мне делать в этом случае?

РЕДАКТИРОВАТЬ 1:

После некоторого дальнейшего копания я заметил, что другие сталкиваются с этой проблемой. Эта проблема проистекает из процесса травления, и это травление создает копию в памяти, но по какой-то причине не выпускает ее. Есть ли способ освободить память после завершения процесса протравливания.

РЕДАКТИРОВАТЬ 2:

При удалении протравленного файла с диска, используйте:

!rm my_array 

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

...