#python #memory-management #memory-leaks #sqlalchemy #memory-consumption
#python #управление памятью #утечки памяти #sqlalchemy #потребление памяти
Вопрос:
Я пытаюсь оптимизировать потребление памяти в одном из сценариев и использовать memory_profiler
модуль для отслеживания потребления памяти.
Вот пример того, что он показывает:
91.3 MiB 0.0 MiB 1 items = Items.query.filter(
106.1 MiB 14.9 MiB 1 Items.instance_id == instance_id,
).all()
106.1 MiB 0.0 MiB 4116 items_ids = [i.id for i in items]
106.1 MiB 0.0 MiB 1 zipfile.append(
106.1 MiB 0.0 MiB 1 "items.json",
106.1 MiB 0.0 MiB 1 json.dumps(
108.4 MiB 2.3 MiB 1 ItemDumpSchema(many=True).dump(items)
)
)
106.9 MiB -1.5 MiB 1 del items
Как вы можете видеть, при получении списка элементов из базы данных потребление памяти увеличилось на 14,9 Мбайт.
Затем я сохраняю эти данные в zip-архив в ОЗУ, и сжатые в нем данные увеличивают потребление еще на 2,3 Мбайт.
Но когда я вызываю del items
после этого, память освобождается только на 1,5 Мбайт.
Я думаю, что sqlalchemy по-прежнему хранит ссылки на эти объекты, поскольку они привязаны к текущему сеансу, но я не понимаю, как их очистить.
Я пытался session.expunge_all ()
, но это не сработало. Также я попытался позвонить gc.collect()
, и это тоже не сработало.
Версия SQLAlchemy 1.2.12
Версия Python 3.6
Комментарии:
1. Вопросы о ваших реальных требованиях: вам нужно извлекать реальные объекты или достаточно извлекать только те значения, которые вам нужны (в примере, который вы используете только
id
). Вам нужен списокItems
или вы можете выполнить итерацию по запросу без вызова.all()
?2. @snakecharmerb, да, я поместил полный дамп объектов в архив
3. Я пробовал перебирать объекты через
yield_per ()
, но потребление памяти остается тем же. Но меня больше интересует понимание самого механизма, почему после удаления объектов память не очищается полностью