【问题标题】:Python SQLAlchemy memory leak on LinuxLinux 上的 Python SQLAlchemy 内存泄漏
【发布时间】:2013-01-25 20:08:20
【问题描述】:

我编写了一个遍历大型数据库表的脚本。 (~150K 行。)为了避免使用太多内存,我使用了这个windowed_query method。我的脚本是这样的:

query = db.query(Table)

count = 0
for row in windowed_query(query, Table.id, 1000):

    points = 0

    # +100 points for a logo
    if row.logo_id:
        points += 100

    # +10 points for each image
    points += 10 * len(row.images) #images is a SQLAlchemy one-to-many relationship

    #...The script continues with much of the same...

    row.points = points
    db.add(row)

    count += 1
    if count % 100 == 0:
        db.commit()
        print count

request.db.commit()

当尝试在 CentOS 服务器上运行它时,它会在被内核杀死之前运行 9000 行因为它使用了大约 2GB 的内存

在我的 Mac 开发环境中,它的运行就像一个魅力,即使它运行在完全相同版本的 Python (2.7.3)、SQLAlchemy (0.7.8) 和 psycopg2 (2.4.5) 上。

使用 memory_profiler 进行一些简单的调试:在 Linux 上,每段查询数据库的代码都会少量增加内存,而且增长从未停止。在 Mac 上,也发生了同样的事情,但在增长了 ~4MB 之后,它趋于平稳。就好像在 Linux 上没有任何东西被垃圾收集一样。 (我什至尝试每 100 行运行一次 gc.collect()。没有做任何事情。)

有人知道发生了什么吗?

【问题讨论】:

  • 也许您遇到了这个错误? velocityreviews.com/forums/…
  • 但是windowed_query最大的查询是1000行,所以fetchone使用fetchall的内存并不能解释2GB的内存使用。
  • 啊啊啊啊……我想通了。我正在使用 Pyramid,并启用了调试工具栏。禁用它后,内存使用量稳定在 73MB。问题解决了!
  • @TheronLuhn 嘿,很高兴你解决了这个问题!由于您的问题已解决,请随时post an answer to your own question 并将其标记为“已接受”(单击绿色大勾号)。这有助于其他人知道您的问题已解决:)
  • 好的,我会这样做的。

标签: python sqlalchemy psycopg2


【解决方案1】:

事实证明 Pyramid 的调试工具栏已启用,这就是高内存使用的原因。我禁用了它,脚本就像一个魅力。

【讨论】:

  • 是的,大多数调试工具栏都保留了发送到服务器以供以后调试的 sql(Flask 的调试工具栏也有类似的乐趣)。
猜你喜欢
  • 2017-12-30
  • 2021-02-06
  • 2011-08-20
  • 2011-04-03
  • 1970-01-01
  • 2023-03-21
  • 2011-07-30
  • 2012-12-02
相关资源
最近更新 更多