大規模なデータベーステーブルを反復処理するスクリプトを作成しました。(〜150K行。)メモリの使用量が多すぎるのを避けるために、このwindowed_queryメソッドを使用しています。私のスクリプトは次のようになります。
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サーバーで実行しようとすると、最大2GBのメモリを使用しているため、カーネルによって強制終了される前に9000行を通過します。
私のMac開発環境では、Python(2.7.3)、SQLAlchemy(0.7.8)、およびpsycopg2(2.4.5)のまったく同じバージョンで実行されていても、魅力のように機能します。
いくつかの簡単なデバッグのためのmemory_profilerの使用:Linuxでは、データベースにクエリを実行する各コードによってメモリがわずかに増加し、増加が止まることはありませんでした。Macでも同じことが起こりましたが、4MBまで成長した後は横ばいになりました。Linuxではガベージコレクションが行われていないかのようです。(100行ごとにgc.collect()を実行しようとしました。何もしませんでした。)
誰かが何が起こっているのか手がかりを持っていますか?