接收SystemError:使用Python多处理时,PyObject_Call中的NULL结果没有错误

时间:2015-08-25 15:38:58

标签: python image-processing multiprocessing threadpool anaconda

我已经四处寻找,但在这个问题上有几个问题,但它们似乎都不符合我的背景。

我正在使用anaconda发行版在Python中进行图像分割算法。在算法的开始阶段,必须计算权重矩阵,以给出图像的每个像素之间的边缘的权重(使用像素作为加权图形数据结构中的节点)。显然,这会产生一个巨大的矩阵((imageWidth * imageHeight)**2)。这需要很长时间来构建越来越大的图像,所以不久前我实现了一些函数来使用机器上的所有cpu来构建矩阵。

在测试期间,这对我来说完全没问题。然而,我们的算法一直在稳步改进,现在可以测试一些真实的数据(从X射线显微镜收集)。到目前为止,我们的测试不超过64x64,这需要花费很长时间,所以我们已经搬到了拥有40个处理器的机器上。

现在我们已经移动了,我突然在多处理功能中遇到错误:

SystemError: NULL result without error in PyObject_Call

我不明白这一点,因为唯一的区别是cpu的数量。为什么会导致问题?如果有人知道python的多处理包实际上是如何工作的,那么也许你可以看到我不知道的东西。

以下是有问题的功能。第一个启动进程池:

def CreateMatrix(self, sigmaI, sigmaX):                                

    cpus = mp.cpu_count()
    poolCount = cpus
    args = [(self, sigmaI, sigmaX, i,) for i in range(self.numPixels)]

    pool = mp.Pool(processes = poolCount)
    tempData = pool.map(unwrap_CreateMatrix, args)

    for pixelList in tempData:                                          
        for pixel in pixelList:
            self.data[pixel[1]] = pixel[0]

    self.matrix = numpy.matrix(self.data.reshape(self.columns, self.rows), numpy.float64)
    return

第二个如果被每个进程调用(并且没有任何东西可以处理进程池的创建或处理,所以我怀疑问题在这里):

def CreateMatrixPixelA(self, sigmaI=1, sigmaX=1, i = 0):               

    pixelA = self.pixelArray[i]
    pixelAData = []

    j = 0
    for pixelB in self.pixelArray:
        stride = (i * self.numPixels) + j

        locationDiff = self.CalcLocationVectorNorm(pixelA, pixelB)

        if locationDiff < self.distance:
            intensityDiff = self.CalcPixelVectorNorm(pixelA, pixelB)   
            locationDiff = -1 * pow(locationDiff,2)
            intensityDiff = -1 * pow(intensityDiff, 2)                 
            value = math.exp(intensityDiff / sigmaI) * math.exp(locationDiff / sigmaX)
            pixelAData.append((value, stride))

        j += 1

    return pixelAData

也是这一个,只是为了避免任何混淆:

def unwrap_CreateMatrix(args):                                                
    return WeightMatrix.CreateMatrixPixelA(*args)

抱歉文字的大墙。我确定答案很简单,我只是不知道哪种信息会有所帮助,所以我已经把所有相关内容都包括在内。我唯一的想法是我使用的图像太大(虽然非常怀疑),或者这台机器上安装的软件包可能存在问题(虽然这台机器正在使用anaconda,就像所有其他测试机器一样。)

0 个答案:

没有答案