3

大規模なデータベーステーブルを反復処理するスクリプトを作成しました。(〜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()を実行しようとしました。何もしませんでした。)

誰かが何が起こっているのか手がかりを持っていますか?

4

1 に答える 1

4

Pyramidのdebugtoolbarが有効になっていることがわかりました。これが、メモリ使用量が多い理由です。私はそれを無効にしました、そしてスクリプトは魅力のように働きました。

于 2013-12-24T15:01:59.627 に答える