我正在对神经感觉系统进行一些建模,该系统对于系统的不同阶段具有不同的模型组件。每个阶段的计算都是并行完成的,然后传递到下一个阶段。
我遇到了multiprocessing.pool.MaybeEncodingError: Error sending result: '[<periphery_configuration.PeripheryOutput object at 0x10d00cf28>]'. Reason: 'error("'i' format requires -2147483648 <= number <= 2147483647",)'
,我认为这意味着我正在尝试传递一个太大的 numpy 数组列表,以至于multiprocessing
索引空间不足。
我已尝试使用 来解决此问题joblib
,如下所示。我究竟做错了什么?根据他们的文档,我应该自动记忆到磁盘;这似乎没有发生。
这是一个简短的实现。调用has_shareable_memory
是一些丑陋的霰弹枪调试,我不完全理解它应该做什么。
以下代码在self.stimulus
包含少于约 10,000 个元素时有效。它self.stimulus
在. results = Parallel...
_ 是计算一个结果的方法。 run
self.solve_one_cochlea
import multiprocessing as mp
from datetime import datetime, timedelta
from joblib import Parallel, delayed
from joblib.pool import has_shareable_memory
from periphery_model import CochleaModel
class Periphery:
def init():
self.cochlear_list= [[CochleaModel(), self.stimulus[i], self.irr_on[i], i, (0, i + 1)] for i in range(len(self.stimulus))]
def run(self) -> [PeripheryOutput]:
"""Simulate sound propagation up to the auditory nerve for many stimulus levels
:return: A list of output data, one for each stimulus level
"""
s1 = datetime.now()
results = Parallel(n_jobs=mp.cpu_count(), max_nbytes=10e6)(delayed(self.solve_one_cochlea, has_shareable_memory)(xx) for xx in self.cochlear_list)
self.save_model_configuration()
print("\ncochlear simulation of {} stimulus levels finished in {:0.3f}s".format(len(self.stimulus), timedelta.total_seconds(
datetime.now() - s1)))
return results