現在、リアルタイムでログファイルを監視し、その結果に基づいてPostgresqlデータベースのエントリを更新するPythonデーモンプロセスを作成しています。このプロセスでは、ログファイルに表示される一意のキーと、そのキーから読み取られた最新の値のみが考慮されます。Pythonデーモンプロセスメモリ管理
私はポーリング手法を採用しており、10秒ごとに新しいバッチを処理しています。データベースへの無関係な更新を避けるために、データの全体的なセットを減らすために、私はキーと最新の値をdictに格納するだけです。過去10秒間のアクティビティの程度に応じて、このディクテーションは10〜1000の一意のエントリによって異なる場合があります。そしてdictは "処理され"、その結果はデータベースに送られます。
私の主な関心事は、メモリ管理と時間の経過とともに(日、週など)のことです。これは常に実行されているデーモンプロセスなので、メモリ使用量はdictのサイズに基づいて大きくなりますが、適切に縮小することはありません。私は、標準の参照を使用してdictをリセットし、バッチを処理した後にdict.clear()メソッドを試しましたが、メモリ使用量の変更は見られませんでした(FreeBSD/top)。 gc.collect()を強制するとメモリが回復するようですが、通常は約50%しか回復しません。
あなたはどのように進めるべきかアドバイスしていますか?私のプロセスでもっと何かできることはありますか?問題の周りに別の道が見える場合は、チャイムしてください:)
使用しているPythonのバージョンは? Python 2.5より古いバージョンではピークメモリ使用量が保持され、OSはそれを再利用しません。 –
私はPython 2.7.2を実行しています – Keryl
ヒープを使用してコード内のメモリリークをデバッグすることをお勧めします:http://guppy-pe.sourceforge.net/#Heapy –