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.libmdaxdrlib.formats.libdcd 文件作为参考。

6.32.2. 测试

6.32.2.1. _SingleFrameReader测试

如果新的阅读器是单帧阅读器,则基本测试通常应该继承自 _SingleFrameReader ,在那里测试可腌性。

6.32.2.2. BaseReaderTest和MultiFrame ReaderTest

如果新阅读器的测试使用 BaseReaderTestMultiframeReaderTest ,当前时间步信息是否保存(前者),它的相对位置是否保持,即Next()读取正确的下一个时间步,以及它的最后一个时间步是否可以被酸洗。

6.32.2.3. 文件处理程序测试

如果新的读取器使用 util.anyopen() ,在内部添加必要的测试 parallelism/test_multiprocessing.py 对读者来说。

如果新的读取器使用新的可拾取I/O类访问文件,请在其中添加必要的测试 utils/test_pickleio.py 对于I/O类, parallelism/test_multiprocessing.py 对读者来说。

6.32.3. 当前实施的可拾取IO格式