2012-03-06 11 views
1

私は次のポストは非常に役に立った: How to pickle yourself?自己消化および実行状態に戻る?

この解決策の制限は、クラスが再ロードされたとき、それはその「ランタイム」の状態で返却されていないということですが。すなわち、それはダンプされた瞬間にすべての変数およびクラスの一般状態をリロードするが、その時点からは実行を継続しない。

考えてみましょう:

class someClass(object): 
    def doSomething(self): 
     i = 0   
     while i <= 20: 
      execute 
      i += 1 
      if i == 10: 
      self.dumpState() 

    def dumpState(self): 
     with open('somePickleFile','wb') as handle: 
     pickle.dump(self, handle) 

    @classmethod 
    def loadState(cls, file_name): 
     with open(file_name, 'rb') as handle: 
      return pickle.load(handle) 

を上記工assのインスタンスを作成することによって、実行された場合:これは、実行時の状態にクラスを返さない

sC = someClass() 
sC.doSomething() 
sC.loadState('somePickleFile') 

、それはを通じて継続していませんwhileループはi == 20までです。

これは正しい方法ではないかもしれませんが、私のプログラムのランタイム状態をキャプチャする方法を見つけることを試みています。つまり、フリーズ/休止してからrelaunそれを別のマシンに移動した後にチャットしてください。これは、チェックポイントをサポートしていないクラスタ上のキューイングシステムによって強制される時間制限に関する問題が原因です。

答えて

1

PickleとUnpickleだけでは、コードに気付かれることなく、そのアプローチは不可能です。

Pickleは、基本的なPythonオブジェクトと、それらの基本型を参照する通常のユーザークラスを保存できます。しかし、実行中のコンテキストの情報を必要に応じてフリーズすることはできません。

Pythonでは、実行中のコードコンテキストにフレームオブジェクトを渡すことはできませんが、inspectモジュールの "inspect.currentframe"を呼び出してフレームオブジェクトを取得できます。これにより、現在実行中のコード行、ローカル変数、ローカル変数の内容などを見ることができますが、Pythonインタープリタのデータ構造の生のメモリ操作を再構築することなく、純粋なPython内部には何もありません実行中のフレームオブジェクトを返し、実行をそこにジャンプします。

このアプローチでは、プロセス全体を「フリーズする」方が良いでしょう。それは、O.Sを使用したメモリデータ構造です。それを行う方法です(おそらく、Linuxにはその方法があり、プロセスで使用されているリソースのようなファイル/ファイルがない場合は動作するはずです)。

または、Python内から、あなたが望むように、あなたの状態データを「ブックチェック」して、ピクルが「見る」ことができるようにしなければなりません。あなたの基本的な例では、あなたのような何かにあなたのコードをリファクタリングする必要があります

class someClass(object): 
    def setup(self): 
     self.i = 0 
    def doSomething(self):  
     while self.i <= 20: 
      execute 
      i += 1 
      if i == 10: 
      self.dumpState() 
    ... 
    @classmethod 
    def loadState(cls, file_name): 
     with open(file_name, 'rb') as handle: 
      self = pickle.load(handle) 
     if self.i <= 20: # or other check for "running context" 
      return self.doSomething() 

ここでの基本的な違いは、オブジェクト変数としてそれ以外の地域の「I」varianbleの記帳され、かつinitizationコードを分離します。このようにして、実行を続けるために必要なすべての状態(この小さな例の場合)はオブジェクトの属性に記録されます。オブジェクトの属性は正しく節約できます。

+0

ありがとう..私はこれを試してみて、それは私が必要とするもののために大きく働いています...ありがとう。 – aurobhima

+0

関連オブジェクトを持つPythonリストに電子メールが届きました。http://bugs.python.org/issue14288をチェックしてください。Python 3.3がイテレーターをピクルリングするサポートを追加し、実行状態を簡単にすることができるかもしれません。 。 – jsbueno

0

loadStateは、someClassの新しいインスタンス(またはファイルにピクルスしたもの)を返すclassmethodです。

+0

訂正ありがとうございます。 – aurobhima

0

私は、pickleは実行中のメソッドの内部状態ではなく、インスタンスの属性値のみを保持すると信じています。メソッドが実行されているという事実は保存されず、ローカル変数の値は保存されません(例のように)。

関連する問題