Помогите разобраться, что кушает память
Есть простой тг бот, который АФК ждет, когда ему отправят таблицу Эксель. Как только получает, он е обрабатывает и возвращает. Бот лежит на сервере арендованном в облаке. На сервере 2 гига оперативки, при этом в пассивном состоянии бот кушает 10% памяти, а в активном 12. На мой взгляд для бота, который ничего не делает это слишком. Добавил в него pympler, вот что получил
Использование памяти:
types | # objects | total size
======================================================= | =========== | ============
dict | 164203 | 37.97 MB
str | 67892 | 11.68 MB
code | 22421 | 3.88 MB
type | 2906 | 2.49 MB
tuple | 28081 | 1.80 MB
list | 12489 | 990.35 KB
set | 1896 | 877.44 KB
weakref.ReferenceType | 7509 | 527.98 KB
frozenset | 1348 | 514.09 KB
openpyxl.descriptors.MetaSerialisable | 424 | 444.12 KB
pydantic.fields.FieldInfo | 1989 | 435.09 KB
pydantic._internal._model_construction.ModelMetaclass | 410 | 429.22 KB
builtin_function_or_method | 4541 | 319.29 KB
abc.ABCMeta | 287 | 296.72 KB
pydantic_core._pydantic_core.SchemaValidator | 408 | 248.62 KB
ни о каких 200мб тут вообще речи не идёт.
Вопрос - куда расходуется память? как понять и как пофиксить?
Ответы (1 шт):
Сильно не ругайся я не программист, а так себе, возможно дело в структурах данных? К примеру list и tuple - не важно сколько в нем находится элементов (2, 200, 1000000) скорость доступа к элементу будет постоянна т.е при поиске элемента будет затрачиваться одно и то же время не зависимо от размера списка или кортежа это примерно 0.017 секунды. Рекомендуется использовать tuple поскольку они оптимизированы. при старте python сразу знает сколько tuple займет места в памяти и сразу резервирует место в памяти под tuple. А при создании list python каждый раз обращается к ОС и просит выделить память. Кроме того пустой list занимает 56 байт, а tuple 40 байт. Очевидно, что и python во время выполнения программы создает кучу кортежей и списков и при правильном использовании tuple будет экономиться время и ПАМЯТЬ. Но использовать tuple надо обоснованно. И не надо заменять список кортежем там, где идет изменение размера. Так же если заранее известен размер списка, то лучше его создать сразу заполнив нулевыми значениями и в этом случае не использовать append. Кроме того можно посмотреть как создаются списки - например на List() будет затрачено ровно в 2 раза больше времени чем на создание списка через [] В общем я не особо разбираясь в программировании начал бы искать от сюда.