2011-09-09 3 views
4

私たちには1つのインタープリタしかないシステムがあります。多くのユーザースクリプトがこのインタープリターを経由します。私たちは各スクリプトのメモリ使用量を制限したいと思っています。プロセスのみが存在し、そのプロセスはスクリプトごとにタスクレットを呼び出します。したがって、1つのインタプリタと1つのプロセスしかないので、各スクリプトのメモリ使用量を制限する方法はわかりません。これを行う最善の方法は何ですかPythonスクリプトのメモリを追跡する方法

+5

"私たちには1台のインタープリタしかないシステムがあります"。複数のインタプリタを使って、自分自身で多くの作業を省き、実際のシステムを手に入れましょう。 –

答えて

3

私はそれはまったく可能ではないと思います。あなたの質問は、あなたのタスクレットで使用されるメモリが完全に分離されていることを意味します。おそらくそうではありません。 Pythonは整数のような小さなオブジェクトを最適化しています。私の知る限りでは、コード内の各3は同じオブジェクトを使用していますが、これは問題ではありません。したがって、あなたのタスクレットのうちの2つが同じ(小さい?)整数を使用する場合、それらはすでにメモリを共有しています。 ;-)

+0

もし2人のPythonインタプリタを使っていても、dllのコードを共有していたとしても(少なくともWindowsでは、他のすべてのOSでは同じと思います;)したがって、スレッドごとに "private workingset"を定義するか、それは可能です - 問題は、Pythonがそれを行う能力を持っているかどうかです。おそらくそうではありません。 – Voo

0

メモリはOSプロセスレベルで分離されています。どのタスクレットに、どのスレッドに特定のオブジェクトが属しているのかを伝える簡単な方法はありません。

また、どのタスクレットまたはスレッドがメモリを割り当てているかを分析し、あまり割り当てることを防止するカスタムブックキーピングアロケータを追加する簡単な方法はありません。また、解放されたオブジェクトをディスエーブルするためにガベージコレクションコードにプラグインする必要があります。

カスタムPythonインタプリタを書くことを熱望していない限り、タスクごとのプロセスを使用することが最善の策です。

別のスクリプトを実行する必要があるたびに、インタープリタを強制終了して再起動する必要はありません。いくつかのインタプリタをプールし、スクリプトを実行した後に特定のメモリしきい値を超えたものだけを殺す。必要に応じてOSによって提供される手段によるインタプリタのメモリ消費を制限する。

タスク間で大量の共通データを共有する必要がある場合は、共有メモリを使用します。小さなインタラクションの場合は、ソケットを使用します(必要に応じてメッセージレベルが上にあります)。

はい、これは現在の設定より遅い場合があります。しかし、あなたのPythonを使用して、私はこれらのスクリプトでは、とにかく時間クリティカルな計算をしないと思います。

関連する問題