【发布时间】:2013-01-25 20:08:20
【问题描述】:
我编写了一个遍历大型数据库表的脚本。 (~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()。没有做任何事情。)
有人知道发生了什么吗?
【问题讨论】:
-
也许您遇到了这个错误? velocityreviews.com/forums/…
-
但是
windowed_query最大的查询是1000行,所以fetchone使用fetchall的内存并不能解释2GB的内存使用。 -
啊啊啊啊……我想通了。我正在使用 Pyramid,并启用了调试工具栏。禁用它后,内存使用量稳定在 73MB。问题解决了!
-
@TheronLuhn 嘿,很高兴你解决了这个问题!由于您的问题已解决,请随时post an answer to your own question 并将其标记为“已接受”(单击绿色大勾号)。这有助于其他人知道您的问题已解决:)
-
好的,我会这样做的。
标签: python sqlalchemy psycopg2