Linux上的SQL SQLAlchemy内存泄漏

时间:2013-02-10 16:44:57

标签: python sqlalchemy psycopg2

我编写了一个遍历大型数据库表的脚本。 (~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()。没有做任何事情。)

有人知道发生了什么吗?

1 个答案:

答案 0 :(得分:4)

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