我已经四处寻找,但在这个问题上有几个问题,但它们似乎都不符合我的背景。
我正在使用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,就像所有其他测试机器一样。)