我编写了一个遍历大型数据库表的脚本。 (~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()。没有做任何事情。)
有人知道发生了什么吗?
答案 0 :(得分:4)
事实证明Pyramid的debugtoolbar已启用,这是高内存使用的原因。我禁用它,脚本就像一个魅力。