В настоящее время я работаю над ноутбуком 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,9 ГБ до 5,6 ГБ
- файл с маринованными файлами -> потребление памяти увеличилось с 5,6 ГБ до 8,7 ГБ
- Память внезапно скачет, когда файл обрабатывается до 15,2 ГБ, затем уменьшается до 8,7 ГБ.
- Удаленный массив -> потребление памяти уменьшилось с 8,7 ГБ до 5,4 ГБ
- выполнено сброс -> потребление памяти уменьшилось с 5,4 ГБ до 5,3 ГБ
Обратите внимание, что вышеприведенное основано на контроле памяти на kaggl е и может быть неточным. Я также проверил этот вопрос , но это не помогло в моем случае.
Будет ли это считаться утечкой памяти? Если так, что мне делать в этом случае?
РЕДАКТИРОВАТЬ 1:
После некоторого дальнейшего копания я заметил, что другие сталкиваются с этой проблемой. Эта проблема проистекает из процесса травления, и это травление создает копию в памяти, но по какой-то причине не выпускает ее. Есть ли способ освободить память после завершения процесса протравливания.
РЕДАКТИРОВАТЬ 2:
При удалении протравленного файла с диска, используйте:
!rm my_array
It В итоге мы освободили дисковое пространство и освободили место в памяти. Я не знаю, будет ли полезен приведенный выше лакомый кусочек или нет, но я все равно решил включить его, так как каждый бит информации может помочь.