我编写了一个脚本来遍历一个大型数据库表。(~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行。什么也没做。)
有人知道发生了什么事吗?在
原来Pyramid的debugtoolbar是启用的,这也是内存使用率高的原因。我把它关掉了,剧本就像一个符咒。在
相关问题 更多 >
编程相关推荐