我写了一个遍历大型数据库表的脚本. (〜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已启用,这是占用大量内存的原因.我禁用了它,脚本运行得像个魅力.