Pur*_*rui 4 python memory memory-leaks sqlalchemy
我有以下代码运行大量数据(2M).在完成之前它会占用我所有的4G内存.
for sample in session.query(CodeSample).yield_per(100):
for proj in projects:
if sample.filename.startswith(proj.abs_source):
sample.filename = "some other path"
session.add(sample)
Run Code Online (Sandbox Code Playgroud)
然后我通过一组简化的数据运行它,并用heapy分析堆.get_rp()给了我下面的暗示
0: _ --- [-] 47821 (0x9163aec | 0x9165fec | 0x916d6cc | 0x9251414 | 0x925704...
1: a [-] 8244 tuple: 0x903ec8c*37, 0x903fcfc*13, 0x9052ecc*46...
2: aa ---- [S] 3446 types.CodeType: parseresult.py:73:src_path...
3: ab [S] 364 type: __builtin__.Struct, _random.Random, sqlite3.Cache...
4: ac ---- [-] 90 sqlalchemy.sql.visitors.VisitableType: 0x9162f2c...
5: aca [S] 11 dict of module: ..sql..., codemodel, sqlalchemy
6: acb ---- [-] 48 sqlalchemy.sql.visitors.VisitableType: 0x9162f2c...
7: acba [S] 9 dict of module: ..sql..., codemodel, sqlalchemy
8: acbb ---- [-] 45 sqlalchemy.sql.visitors.VisitableType: 0x9165fec...
9: acbba [S] 8 dict of module: ..sql..., codemodel, sqlalchemy
Run Code Online (Sandbox Code Playgroud)
我是sqlalchemy的新手.这是内存泄漏吗?谢谢.
大多数DBAPI,包括psycopg2和mysql-python,在将它们释放到客户端之前将所有结果完全加载到内存中.SQLA的yield_per()选项无法解决此问题,下面有一个例外,这就是为什么它通常不是一个非常有用的选项(编辑:在完全获取实际行之前它开始流式传输结果的意义上是有用的).
此行为的例外情况是: