这是内存泄漏(使用sqlalchemy / sqlite的python中的程序)
我有以下代码运行大量数据(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) 然后我通过一组简化的数据运行它,并用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...,sqlalchemy 8: acbb ---- [-] 45 sqlalchemy.sql.visitors.VisitableType: 0x9165fec... 9: acbba [S] 8 dict of module: ..sql...,sqlalchemy 我是sqlalchemy的新手.这是内存泄漏吗?谢谢. 解决方法大多数DBAPI,包括psycopg2和mysql-python,在将它们释放到客户端之前将所有结果完全加载到内存中. SQLA的yield_per()选项无法解决此问题,下面有一个例外,这就是为什么它通常不是一个非常有用的选项(编辑:在完全获取实际行之前它开始流式传输结果的意义上是有用的).此行为的例外情况是: >使用不缓冲行的DBAPI. cx_oracle是一个,因为OCI工作的自然方式.不确定pg8000的行为,并且还有一个名为OurSQL的新MySQL DBAPI,其创建者告诉我不会缓冲行. SQLAlchemy 0.6支持pg8000和OurSQL.>使用psycopg2,可以使用“服务器端游标”. SQLAlchemy支持create_engine()标志“server_side_cursors = True”,它使用服务器端游标进行所有行选择操作.但是,因为服务器端游标通常很昂贵,因此会降低较小查询的性能,所以SQLAlchemy 0.6现在使用.execution_options(stream_results = True)在每个语句或每个查询的基础上支持psycopg2的服务器端游标,其中execution_options可用于查询,选择(),文本()和连接.当使用yield_per()时,Query对象调用此选项,因此在0.6中,yield_per()与psycopg2一起使用实际上很有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |