我正在尝试优化其中一个脚本中的内存消耗并使用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.9MiB。
然后我将这些数据保存到 RAM 中的 zip 存档中,其中的压缩数据又增加了 2.3 MiB 的消耗。
但是当我del items
在那之后调用时,内存只释放了 1.5 MiB。
我认为 sqlalchemy 仍然保留对这些对象的引用,因为它们绑定到当前会话,但我不明白如何清除它们。
我试过session.expunge_all ()
了,但没有用。我也试过打电话gc.collect()
,但也没有用。
SQLAlchemy 版本 1.2.12
Python 3.6 版