Linux上的Python SQLAlchemy内存泄漏

我写了一个遍历大型数据库表的脚本. (〜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().什么也没做.)

有人知道发生了什么吗?

解决方法:

事实证明,Pyramid的debugtoolbar已启用,这是占用大量内存的原因.我禁用了它,脚本运行得像个魅力.

上一篇:python-Heroku上的django-hstore


下一篇:python-使用psycopg2将PostgreSQL UUID数组返回为列表