6.32. 坐标阅读器的序列化
为了实现并行性的工作实现,本文档说明了如何在MDAnalysis中序列化不同的坐标读取器的基本思想,以及开发人员应该如何序列化新的读取器。
为了确保每个轨迹读取器都可以成功序列化,我们实现了可拾取的I/O类(请参见 当前实施的可拾取IO格式 )。当文件被浸泡时,打开的文件句柄的文件名和其他必要的属性被保存。在取消酸洗时,文件将按文件名打开。这意味着要成功地取消选取,原始文件仍然必须可以使用其文件名进行访问。为了保留轨迹的当前帧, _read_frame(previous frame)()
将在取消酸洗过程中调用。
6.32.1. 如何序列化新的阅读器
6.32.1.1. 文件访问
如果新的阅读器使用 util.anyopen()
(例如 MDAnalysis.coordinates.PDB.PDBReader
),则无需修改即可对读取处理程序进行酸洗。如果新读取器使用来自其他包的I/O类(例如 MDAnalysis.coordinates.GSD.GSDReader
),并且不能本机进行酸洗,则创建从该包中的文件类继承的新的可拾取类(例如 MDAnalysis.coordinates.GSD.GSDPicklable
),添加 __getstate__()
, __setstate__()
函数(或 __reduce__()
如果需要的话。咨询泡菜 documentation 的),以允许文件处理程序串行化。
6.32.1.2. 去找还是不去找
某些I/O类支持 seek()
和 tell()
允许使用偏移量对文件进行酸洗的函数。对于具有随机访问的MDAnalysis,通常不需要它。但如果在测试过程中出现错误,请找到一种方法来使偏移量工作。或许此I/O类支持帧索引?也许这个I/O类中的文件处理程序支持偏移量?
例如,在 MDAnalysis.coordinates.TRZ.TRZReader
, _read_frame()
通过以下方式实现 _seek()
将文件放入其前一帧,并 _read_next_timestep()
因此,文件的偏移量对这种机器的工作至关重要。
6.32.1.3. 杂项
如果由于一些不可拾取的属性而导致Pickle仍然失败,请尝试找到一种方法来Pickle这些属性,或者编写定制 __getstate__()
和 __setstate__()
方法用于读取器。
如果新的阅读器是用Cython编写的,请阅读 lib.formats.libmdaxdr
和 lib.formats.libdcd
文件作为参考。
6.32.2. 测试
6.32.2.1. _SingleFrameReader测试
如果新的阅读器是单帧阅读器,则基本测试通常应该继承自 _SingleFrameReader
,在那里测试可腌性。
6.32.2.2. BaseReaderTest和MultiFrame ReaderTest
如果新阅读器的测试使用 BaseReaderTest
或 MultiframeReaderTest
,当前时间步信息是否保存(前者),它的相对位置是否保持,即Next()读取正确的下一个时间步,以及它的最后一个时间步是否可以被酸洗。
6.32.2.3. 文件处理程序测试
如果新的读取器使用 util.anyopen()
,在内部添加必要的测试 parallelism/test_multiprocessing.py
对读者来说。
如果新的读取器使用新的可拾取I/O类访问文件,请在其中添加必要的测试 utils/test_pickleio.py
对于I/O类, parallelism/test_multiprocessing.py
对读者来说。