我有一盒原子,大约200k,我想计算原子之间的距离。不使用并行方法进行此计算就花费了很长时间。所以我想用pool.map来帮助我。我首先将盒子切成几个小单元,并定义了一个单元对象,其中包含该单元中的所有原子信息。但是,当我无法将单元格对象列表传递给进程时。我是这项多处理任务的初学者,任何人都可以对如何解决这个问题有所了解吗?这是我的脚本的简化:
class atoms():
def __init__(self):
self.__idx__ = 0 # Has other function to change this idx and coord
self.__coord__ = [x, y, z]
def getIdx(self):
return self.__idx__
class cell():
def __init__(self):
self.__idx__ = 0
self.__atoms__ = [atom1, ...,]
def outInfo(self):
for a in self.__atoms__:
print(a.getIdx())
from multiprocessing import Process, Value, Array
def f(cell_lists):
for c in cell_lists:
print(c.outInfo())
if __name__ == '__main__':
cell_lists = [cell1, cell2, ..., cell8]
p = Process(target=f, args=(cell_lists ))
p.start()
p.join()
错误消息是“ PicklingError:无法腌制:它与cell.Cell不是同一对象”
答案 0 :(得分:0)
感谢迈克的建议。我找出问题所在。由于我正在使用spyder编辑脚本。每次为了节省时间,我没有创建一个新的单元项目,而是使用生成的项目。并且这可能将python3误导到另一个单元对象。避免此问题的简单方法是重新启动脚本或创建新的单元格对象,以避免在内存中使用生成的旧单元格对象。