2

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

私はポーリング アプローチを使用しており、10 秒ごとに新しいバッチを処理しています。データベースへの余分な更新を避けるためにデータの全体的なセットを減らすために、キーと最新の値のみを dict に保存しています。過去 10 秒間のアクティビティの量に応じて、この dict は 10 ~ 1000 の一意のエントリの範囲で変化する可能性があります。次に、辞書が「処理」され、それらの結果がデータベースに送信されます。

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

私がどのように進めるべきかについて何かアドバイスはありますか?私のプロセスで他にできることはありますか?この問題について別の道を見つけたら、遠慮なく声をかけてください:)

4

1 に答える 1

0

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

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

于 2012-02-01T01:24:15.073 に答える