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)

上記が実行される場合、someClass のインスタンスを作成することによって:

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

これはクラスを実行時状態に戻さず、i == 20 になるまで while ループを続行しません。

これは正しいアプローチではないかもしれませんが、プログラムの実行時の状態をキャプチャする方法、つまりフリーズ/休止状態にし、別のマシンに移動した後に再起動する方法を見つけようとしています..これは私が抱えている問題によるものです.チェックポインティングをサポートしていないクラスタ上のキューイング システムによって適用される時間制限があります。

4

3 に答える 3

1

このアプローチは、コードが認識しない限り、Pickle と Unpickle だけでは不可能です。

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

Python では、フレーム オブジェクトを介して実行中のコード コンテキストにアクセスする限定的な (しかし強力な) 方法が許可されています。これにより、現在実行中のコード行、ローカル変数、ローカル変数の内容などを確認できますが、再構築するために Python インタープリターのデータ構造の生のメモリ操作に頼らずに、pure-python の内部では方法がありません。実行途中のフレーム オブジェクトを取得し、そこに実行をジャンプします。

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

または、必要に応じて Python 内から、Pickle が「参照」できるように、すべての状態データの「ブック チェック」を維持する必要があります。基本的な例では、コードを次のようにリファクタリングする必要があります。

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" 変数をオブジェクト変数として記録し、初期化コードを分離することです。このようにして、実行を継続するために必要なすべての状態 (この小さな例では) がオブジェクト属性に記録されます。これは適切にピクルすることができます。

于 2012-03-06T19:23:01.773 に答える
0

pickleはインスタンスの属性値のみを保持し、実行中のメソッドの内部状態は保持しないと思います。メソッドが実行されていたという事実は保存されず、例のiのようにローカル変数の値も保存されません。

于 2012-03-06T14:52:44.637 に答える
0

loadStateの新しいインスタンス(またはファイルにピクルスにされた何か)をclassmethod返すことです。someClassしたがって、代わりに次のように書く必要があります。

sC = someClass()
sC.doSomething()
sC = someClass.loadState('somePickleFile')
于 2012-03-06T14:48:42.753 に答える