Python Multiprocessing和cPickle.PicklingError - 如何调试?

时间:2016-02-11 02:24:29

标签: python debugging multiprocessing pickle

我试图通过使用Python 2.7.6进行多处理来加速我的python代码。

以下' minimal'示例实际上有效 - (只要你有lmfit和parmap)。它的结构与我的实际代码非常相似。 我的问题在于我的真实代码' parmap.starmap,基本上是多个参数的map()(参见thisthis post)失败,

cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

有没有办法找出哪种方法可以腌制? 就像在示例中一样,我确保传递给parmap.starmap的函数是在模块的顶层定义的。它实际上是完全相同的功能。

调试我的真实&#39;代码,传递给starmap的函数在&f; func_globals&#39;下面有很多条目。我不知道这与它有什么关系,但我也不知道为什么有些条目存在。 所以我想我真正的问题是:如何通过导入其他模块或类来实现以下代码失败?我应该在实际代码中查找哪些内容以查看这是否是我的问题?

import numpy as np
from lmfit.models import GaussianModel
import parmap

def do_fitting(a_instance, y, x):
    return a_instance.fit(x, y)

def gaussian(x, amp, cen, wid):
    return amp * np.exp(-(x-cen)**2 /wid)

class A(object):
    def __init__(self, model):
        super(A, self).__init__()
        self.model = model

    def fit(self, x, y):
        return self.model.fit(y, params=self.model.guess(y,x=x), x=x, verbose=False).result.params.valuesdict()

class B(object):
    def __init__(self):
        super(B,self).__init__()
        self.gaussians = []
        self.gmodels = {}
        self.x = np.linspace(-10,10)
        for n in range(400):
            self.gmodels[n] = A(GaussianModel())
            self.gaussians.append(gaussian(self.x, 2.33, 0.21, 1.51) + np.random.normal(0, 0.2, len(self.x)))

    def do_fits_parallel(self):
        results = parmap.starmap(do_fitting, zip(self.gmodels.itervalues(), self.gaussians), self.x)
        return results

if __name__ == '__main__':
    b = B()
    print b.do_fits_parallel()

0 个答案:

没有答案