6

メモリが不足しているシステムを書いています。同じクラスのセットをインポートする複数の python プロセスがあります。プロセスが膨大な数のクラスをロードし、各プロセスが数百メガを消費する場合、10 個のプロセスと私はギグを実行しています。Pythonプロセス間でクラスのインポートを「共有」する方法はありますか?

概要:

import classA # Process 1 : loads classA in memory
import classA # Process 2 : reuses what was loaded previously by Process 1

PS: 私が達成しようとしているのは.so、C/C++ のモジュールで行うことです。

4

2 に答える 2

2

OS が効率的なコピー オン ライト フォークをサポートしている場合 (多くの場合)、少なくともメモリを節約することができます。import親で一度だけすべてfork()を作成してから、すべての子を作成します。

オブジェクトの参照カウントを書き込む必要があるため、小さなオブジェクトが多数ある場合は何も保存しないことに注意してください。ただし、属性ディクショナリのような大規模な静的構造を使用すると、大幅な節約が見込めます。

于 2012-09-28T02:16:39.750 に答える
1

Pythonの設計ではこれが可能だとは思いません。これが重要な場合は、個別のプロセスではなくスレッドを使用することをお勧めします。また、いくつかのモジュールをインポートするだけで 100 メガを実行している場合は、モジュールで何か問題が発生している可能性があります (かなりの量のメモリを使用しているようです)。

絶対にすべてをインポートする必要があり、メモリ使用量を削減できず、スレッドを使用できない場合の 1 つの可能性は、大きなメモリ コードを C/C++ で記述された Python 拡張機能に移動することです。これにより、Python 拡張機能が含まれている共有ライブラリの共通セグメントをプロセス間で共有できます。また、メモリ フットプリントを多少削減することもできます。

PS Pythonでは、実際にはクラスではなくモジュールをインポートしています。C/C++ で、クラスではなくヘッダー ファイルをインクルードする方法と同様です。

于 2012-09-27T22:27:59.317 に答える