Linux上Python SQLAlchemy内存泄漏

2024-04-20 13:35:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个脚本来遍历一个大型数据库表。(~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上什么都没有被垃圾回收。(我甚至试过跑步gc.收集()每100行。什么也没做。)

有人知道发生了什么事吗?在


Tags: 内存idfordbifsqlalchemycounttable