1

我尝试用multiprocessingsPool通过 Python 运行一些任务。一切似乎都正常工作,但有一行代码让 Python 意外退出,它是计算矩阵逆矩阵的那一行。( scipy.linalg.inv())

苹果错误日志打印

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000108

我很确定,它与逆有关,而不是与一些未知变量有关,因为如果我只计算,退出也会发生:

la.inv(np.eye(n))

我认为这可能与la.inv()使用多个线程的事实有关。

注意:如果我在没有并行化的情况下运行代码,它当然可以工作。 如果我只是评论上面的行,它也可以工作

但是,如果我运行一些测试代码,可以最大限度地减少问题:

import numpy as np
import scipy.linalg as la
from multiprocessing import Pool


class ParClass(object):
    def __init__(self):
        super(ParClass, self).__init__()

    def compute(self,x):
        self.x = la.inv(np.random.randn(1000,1000))
        return self


def runPar(x):
        method = ParClassifier()
        method.compute(x)
        return method.x

if __name__ == '__main__':
    pool = Pool(processes=4)
    result = pool.map(runPar, np.arange(1,100))

错误不会发生。那么为什么影响我原来问题打洞过程的一行代码,却不影响一个测试问题呢?这很奇怪,但是以前有人遇到过吗?

编辑: np.linalg.solve()没有做得更好

4

0 回答 0