Python 使用多处理时Pickle中的MemoryError

Python 使用多处理时Pickle中的MemoryError,python,multiprocessing,simulation,pickle,montecarlo,Python,Multiprocessing,Simulation,Pickle,Montecarlo,我正在运行一些物理系统的蒙特卡罗模拟,我需要增加模拟时间步长的粒度(因此n_timesteps=t/dt,其中t是固定的)。这显然会延长每次模拟的运行时间(以及增加内存使用)。 正因为如此,我改变了我的代码,使我的所有处理器都使用pythons多重处理。 这适用于粗略模拟(较大的dt),但一旦降低dt,就会出现酸洗错误: multiprocessing.pool.MaybeEncodingError: Error sending result: '<multiprocessing.pool

我正在运行一些物理系统的蒙特卡罗模拟,我需要增加模拟时间步长的粒度(因此n_timesteps=t/dt,其中t是固定的)。这显然会延长每次模拟的运行时间(以及增加内存使用)。 正因为如此,我改变了我的代码,使我的所有处理器都使用pythons多重处理。 这适用于粗略模拟(较大的dt),但一旦降低dt,就会出现酸洗错误:

multiprocessing.pool.MaybeEncodingError: Error sending result: '<multiprocessing.pool.ExceptionWithTraceback object at 0x000000000B5D6EC8>'. Reason: 'PicklingError("Can't pickle <class 'MemoryError'>: it's not the same object as builtins.MemoryError")'
例如,这个例子不适用于
n_timesteps=60000
,我认为这实际上应该是可以管理的。 我已经将每个子模拟中的模拟数量减少到了2个,这样内存使用量就相当小(以换取速度),并且pickle不必处理大型阵列。 但我真正不明白的是,当执行set_参数时会抛出错误,我不希望出现任何pickle操作

每个模拟都是相互独立的,并且需要相当长的时间,所以我认为:多处理在这里是个好主意。然而,由于我不是很有经验,特别是在多重处理方面,我真的不确定什么是解决这个问题的合适方法。
(我运行的Windows有8个内核和8GB ram—如果需要更多信息,我很乐意提供)

好的,所以事实证明,问题实际上不是由pickle本身引起的,而是由模拟器包更新中的一个bug引起的,它试图创建一个大小为(n_timesteps,n_timesteps)的numpy数组。很抱歉造成混淆。

在错误位置之前打印参数[0]时,您看到了什么?此外,代码是否在较小的
n_时间步
下工作,例如,100?
参数[0]
在这一点上是我所期望的。它具有预期的形状,在特殊情况下,约60000个
n_时间步
的大小约为5.4 MB。是的,对于较小的
n\u时间步
它工作得很好。如果我没记错的话,断点大约在
n\u时间步
=3000(大小约为.3MB)。由于
run\u simulation
中的
参数
是一个列表/元组,
def subsimulation(参数):
应该是
def subsimulation(*parameters):
。您是否看到此更改中存在相同的错误?为了澄清,我对代码进行了一些编辑。但是,使用
*参数时,我仍然看到相同的错误。