gpt4 book ai didi

python - 这是内存泄漏吗(python 中带有 sqlalchemy/sqlite 的程序)

转载 作者:太空狗 更新时间:2023-10-30 02:14:21 34 4
gpt4 key购买 nike

我让以下代码运行在大量数据 (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..., codemodel, sqlalchemy
8: acbb ---- [-] 45 sqlalchemy.sql.visitors.VisitableType: 0x9165fec...
9: acbba [S] 8 dict of module: ..sql..., codemodel, sqlalchemy

我是 sqlalchemy 的新手。这是内存泄漏吗?谢谢。

最佳答案

大多数 DBAPI,包括 psycopg2 和 mysql-python,在将所有结果发布给客户端之前将它们完全加载到内存中。 SQLA 的 yield_per() 选项不能解决这个问题,下面有一个异常(exception),这就是为什么它通常不是一个非常有用的选项(编辑:在实际行被完全获取之前开始流式传输结果的意义上有用)。

此行为的异常(exception)情况是:

  1. 使用不缓冲行的 DBAPI。 cx_oracle 是其中之一,这是 OCI 工作的自然方式的结果。不确定 pg8000 的行为,还有一个名为 OurSQL 的新 MySQL DBAPI,它的创建者告诉我它不缓冲行。 SQLAlchemy 0.6 支持 pg8000 和 OurSQL。
  2. 对于 psycopg2,可以使用“服务器端游标”。 SQLAlchemy 支持 create_engine() 标志“server_side_cursors=True”,它使用服务器端游标进行所有行选择操作。但是,由于服务器端游标通常很昂贵,因此会降低较小查询的性能,因此 SQLAlchemy 0.6 现在使用 .execution_options(stream_results=True) 在每个语句或每个查询的基础上支持 psycopg2 的服务器端游标,其中 execution_options 可用查询、select()、text() 和连接。 Query 对象在使用 yield_per() 时会调用此选项,因此在 0.6 yield_per() 中结合 psycopg2 实际上很有用。

关于python - 这是内存泄漏吗(python 中带有 sqlalchemy/sqlite 的程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145177/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com