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 的对象,例如打开文件描述符。需要编写Pickle 协议中描述的专用方法__getstate__()和方法,但在当前 0.8.1(2014 年 4 月)版本中,这些都没有实现。__setstate__()

Manel 在他对 MDAnalysis 问题 173 的评论中解释了具体错误:Pickle 搜索__getstate__()方法。虽然没有实现,Universe但它管理自己的属性以动态生成“虚拟属性”,将其解释为原子选择并最终返回一个空的 AtomGroup 实例。这反过来又被称为因为 pickle 认为它是__getstate__. 但是,AtomGroup 是不可调用的,并且会导致错误。

您可能已经注意到,通过询问MDAnalysis 用户列表或提交问题,您得到了更快的响应——Stackoverflow 通常在回答此类特定问题的开发人员列表中较低。

于 2014-04-15T07:11:48.093 回答