Управление памятью SQLAlchemy

#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 () , но потребление памяти остается тем же. Но меня больше интересует понимание самого механизма, почему после удаления объектов память не очищается полностью