Помогите разобраться, что кушает память

Есть простой тг бот, который АФК ждет, когда ему отправят таблицу Эксель. Как только получает, он е обрабатывает и возвращает. Бот лежит на сервере арендованном в облаке. На сервере 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 шт):

Автор решения: MoonInBlack

Сильно не ругайся я не программист, а так себе, возможно дело в структурах данных? К примеру list и tuple - не важно сколько в нем находится элементов (2, 200, 1000000) скорость доступа к элементу будет постоянна т.е при поиске элемента будет затрачиваться одно и то же время не зависимо от размера списка или кортежа это примерно 0.017 секунды. Рекомендуется использовать tuple поскольку они оптимизированы. при старте python сразу знает сколько tuple займет места в памяти и сразу резервирует место в памяти под tuple. А при создании list python каждый раз обращается к ОС и просит выделить память. Кроме того пустой list занимает 56 байт, а tuple 40 байт. Очевидно, что и python во время выполнения программы создает кучу кортежей и списков и при правильном использовании tuple будет экономиться время и ПАМЯТЬ. Но использовать tuple надо обоснованно. И не надо заменять список кортежем там, где идет изменение размера. Так же если заранее известен размер списка, то лучше его создать сразу заполнив нулевыми значениями и в этом случае не использовать append. Кроме того можно посмотреть как создаются списки - например на List() будет затрачено ровно в 2 раза больше времени чем на создание списка через [] В общем я не особо разбираясь в программировании начал бы искать от сюда.

→ Ссылка