2016-04-22 14 views
0

私は別のシミュレーション環境(Pythonでも書かれています)内で機能を最適化するための進化的アルゴリズムを実行しています。シミュレーション環境自体はPythonクラスのインスタンスで、計算コストが高く(1回の実行で約4秒)、約1Gbのメモリを占有します。このシミュレーション環境でテストするために約10万種類の異なる関数を生成しているので、できるだけ多くのシミュレーションをオフラインにする方法が必要です。Python 2.7クラスインスタンスのディープコピーを回避する方法は?

私ができることは、シミュレーションの大部分をあらかじめ計算しておくことです(つまり、クラスのインスタンスを初期化し、クラス関数のサブセットを実行します)。次に、小さなコンポーネント残りのいくつかの機能はクラス内に残っています)。一般に、評価時間は〜1秒に短縮され、実行時間が大幅に短縮されます。

ただし、新しい関数がシミュレーションクラスインスタンスに渡されるたびに、クラスインスタンスは関数によって変更されます(したがって、次の関数評価の結果に影響します)。私はすべての評価の前にクラスインスタンス全体のディープコピーを行うことでこれを防ぐことができますが、そのたびにシミュレーション全体を実行するよりも遅くなります。

各ステージでクラス全体をディープコピーしないで同じ結果を得る方法はありますか?本質的に、各関数の評価は、まったく同じクラスインスタンスに対して実行する必要があります。

おかげ

答えて

1

この問題は、PythonのMultiprocessing.Poolクラス(これは問題の一部ではないと私は言いませんでした)の問題であることが判明しました。デフォルトでプール内の各作業者は、プールが開いている期間全体にわたって存続します。単一のワーカーによって実行されるすべてのプロセスはいつでもメモリに残り、単一のクラスインスタンスがそれらのワーカーに渡されるので、そのクラスインスタンスはソリューションが実行されるたびに更新されます。これを簡単に解決するには、Multiprocessing.Poolの "maxtasksperchild"引数を使用して、1人のワーカーが処理される前に処理できるタスクの数を制限し、新しいワーカーがその場所に生成されるようにします。この値を1に設定すると、すべての問題が解決されました。

0

これが直接あなたの進化のクラスの問題を解決していないが、私はクラスのインスタンスを保存するためのcPickleのパフォーマンスに非常に良い経験を持っていました。私はそれを使用して、非常に大きいカスタムデータ構造の状態を保存し、ロードと保存は非常に高速な操作です。

関連する問題