python
August 31, 2021

Забота о памяти с Python

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

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

Лучший из способов отслеживания созданных вами переменных - это использование магической команды (подробнее читай здесь) %whos, а измерения памяти - функции getsizeof (выводит размер в байтах) модуля sys:

import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.uniform(1,200,size=50000000).astype(np.float16))
%whos
import sys
sys.getsizeof(data)

Удаление ненужных и тяжелых объектов из памяти следует производить командой del:

del data

Теперь что касается аккуратного резервирования места в оперативной памяти. Создадим numpy массив с типом по умолчанию (int64 - 8 байт на число) из 50 млн элементов. Его ориентировочный размер будет - 400 Мб:

Зная специфику данных, мы могли все хранить так:

Теперь массив занял около 50 Мб.

Ниже привожу список числовых типов данных в NumPy для учета при создании массивов и экономии памяти:

Логический

numpy.bool8

Целочисленный знаковый

numpy.int8

numpy.int16

numpy.int32

numpy.int64

Целочисленный беззнаковый

numpy.uint8

numpy.uint16

numpy.uint32

numpy.uint64

Дробный

numpy.float16

numpy.float32

numpy.float64

numpy.float128

Комплексный

numpy.complex64

numpy.complex128

numpy.complex256

Больше о типах можно прочитать здесь.