2012-01-18 8 views
2

現在、リアルタイムでログファイルを監視し、その結果に基づいてPostgresqlデータベースのエントリを更新するPythonデーモンプロセスを作成しています。このプロセスでは、ログファイルに表示される一意のキーと、そのキーから読み取られた最新の値のみが考慮されます。Pythonデーモンプロセスメモリ管理

私はポーリング手法を採用しており、10秒ごとに新しいバッチを処理しています。データベースへの無関係な更新を避けるために、データの全体的なセットを減らすために、私はキーと最新の値をdictに格納するだけです。過去10秒間のアクティビティの程度に応じて、このディクテーションは10〜1000の一意のエントリによって異なる場合があります。そしてdictは "処理され"、その結果はデー​​タベースに送られます。

私の主な関心事は、メモリ管理と時間の経過とともに(日、週など)のことです。これは常に実行されているデーモンプロセスなので、メモリ使用量はdictのサイズに基づいて大きくなりますが、適切に縮小することはありません。私は、標準の参照を使用してdictをリセットし、バッチを処理した後にdict.clear()メソッドを試しましたが、メモリ使用量の変更は見られませんでした(FreeBSD/top)。 gc.collect()を強制するとメモリが回復するようですが、通常は約50%しか回復しません。

あなたはどのように進めるべきかアドバイスしていますか?私のプロセスでもっと何かできることはありますか?問題の周りに別の道が見える場合は、チャイムしてください:)

+0

使用しているPythonのバージョンは? Python 2.5より古いバージョンではピークメモリ使用量が保持され、OSはそれを再利用しません。 –

+0

私はPython 2.7.2を実行しています – Keryl

+0

ヒープを使用してコード内のメモリリークをデバッグすることをお勧めします:http://guppy-pe.sourceforge.net/#Heapy –

答えて

0

dictまたはdictによって参照されるオブジェクトをクリア()すると、含まれているオブジェクトはまだメモリ内に残ります。それらがどこにも参照されていない場合は、見たようにガベージコレクションされる可能性がありますが、ガベージコレクションはdelまたはclear()で明示的に実行されません。

このような質問がありました。https://stackoverflow.com/questions/996437/memory-management-and-python-how-much-do-you-need-to-knowです。要するに、メモリが不足していない場合、これについて多くのことを心配する必要はありません。 FreeBSD自体は仮想メモリを扱う良い仕事をしているので、あなたのPythonプログラムに膨大な量の古いオブジェクトがあっても、あなたのマシンはおそらくディスクにスワップしません。

関連する問題