4

我正在对神经感觉系统进行一些建模,该系统对于系统的不同阶段具有不同的模型组件。每个阶段的计算都是并行完成的,然后传递到下一个阶段。

我遇到了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..._ 是计算一个结果的方法。 runself.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
4

0 回答 0