【问题标题】:How to use pickle to dump a universe object from MDAnalysis module?如何使用 pickle 从 MDAnalysis 模块中转储 Universe 对象?
【发布时间】:2014-05-05 04:10:48
【问题描述】:

我尝试使用 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

任何建议将不胜感激!

【问题讨论】:

    标签: python object serialization pickle mdanalysis


    【解决方案1】:

    更新答案(对于 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
    

    另请参阅用户指南中的Parallelizing Analysis


    旧答案

    MDAnalysis.Universe 对象包含一些无法通过标准机制进行序列化和腌制的对象,例如打开文件描述符。需要编写专门的 __getstate__()__setstate__() 方法,如 Pickle protocol 中所述,但在当前的 0.8.1(2014 年 4 月)版本中都没有实现。

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

    您可能已经注意到,通过在 MDAnalysis user list 上提问或提交问题可以得到更快的回复 - Stackoverflow 通常在回答此类特定问题的开发人员列表中排名靠后。

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 2021-11-06
      • 1970-01-01
      • 2011-06-02
      • 2017-08-16
      • 1970-01-01
      • 2022-01-10
      • 2021-01-28
      • 1970-01-01
      相关资源
      最近更新 更多