1

pickle を使用して MDAnalysis.universe オブジェクトをダンプしようとしましたが、次のようなエラー メッセージが表示されました。

Traceback (most recent call last):
  File "convert.py", line 9, in <module>
    blob = pickle.dumps(u)
  File "/usr/lib/python2.7/pickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "/usr/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/usr/lib/python2.7/pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python2.7/pickle.py", line 419, in save_reduce
    save(state)
  File "/usr/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python2.7/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems
    save(v)
  File "/usr/lib/python2.7/pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "/usr/lib/python2.7/copy_reg.py", line 84, in _reduce_ex
    dict = getstate()
TypeError: 'AtomGroup' object is not callable

任意の提案をいただければ幸いです!

4

1 に答える 1

0

更新された回答 (MDAnalysis ≥ 2.0 の場合)

MDAnalysis 2.0.0 (2021 年 8 月) 以降、ユニバースをピクルすることができます。

import MDAnalysis as mda
import pickle
u = mda.Universe(topology, trajectory)
pickle.dump(u, open("universe.pkl", "wb"))

# load pickled universe
u_pickled = pickle.load(open("universe.pkl", "rb"))

# test that we get same positions
(u_pickled.atoms.positions == u.atoms.positions).all()
# -> True

# but that universes are different
u == u_pickled
# -> False

ユーザー ガイドの「解析の並列化」も参照してください。


古い答え

MDAnalysis.Universeオブジェクトには、オープン ファイル記述子など、標準メカニズムではシリアル化およびピクルできないオブジェクトが含まれています。Pickle プロトコルで説明されているように特殊__getstate__()__setstate__()されたメソッドを記述する必要がありますが、現在の 0.8.1 (2014 年 4 月) リリースの時点では実装されていません。

特定のエラーは、MDAnalysis Issue 173 に関する Manel のコメントで説明されています: Pickle がメソッドを検索します__getstate__()。これは実装されていませんUniverseが、独自の属性を管理してその場で「仮想属性」を生成し、これをアトム選択として解釈し、最終的に空の AtomGroup インスタンスを返します。これは、 pickle が のローカル実装であると信じているため、呼び出され__getstate__ます。ただし、AtomGroup は呼び出し可能ではなく、エラーが発生します。

お気づきかもしれませんが、MDAnalysis のユーザー リストで質問したり、問題を報告したりすると、より迅速な回答が得られます。Stackoverflow は通常、そのような特定の質問に回答する開発者のリストの下位にあります。

于 2014-04-15T07:11:48.093 に答える