【发布时间】:2015-07-28 21:56:06
【问题描述】:
我已经在互联网上搜寻了答案,但我找不到任何适用于我的情况。我读过multiprocessing.Manager,尝试来回传递东西,但似乎都不能很好地与NumPy数组一起使用。我尝试过使用Pool,但是我的目标方法没有返回任何东西,它只是进行了更改到一个数组,所以我也不知道如何设置它。
现在我有:
def Multiprocess(self, sigmaI, sigmaX):
cpus = mp.cpu_count()
print('Number of cpu\'s to process WM: %d' % cpus)
processes = [mp.Process(target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,)) for i in range(self.numPixels)]
for p in processes:
p.start()
for p in processes:
p.join()
目标函数CreateMatrixMp 获取传递的值,并在进行计算后将值附加到数组data。这个数组被声明为self.data = numpy.zeros(self.size, numpy.float64)。如果CreateMatrixMp 方法的详细信息有帮助,我也可以发布。
我尝试在上面运行进程的地方添加这个:
mgr = mp.Manager()
sharedData = mgr.Array(ctypes.c_numpy.float64, self.data)
然后将sharedData传递给CreateMatrixMp,可以在其中进行修改。一旦所有进程都运行完毕并且数组完成后,我只需执行self.data = sharedData。
但这不起作用(尽管我知道我没有正确设置它)。这应该如何使用 NumPy 数组来完成?我希望每个进程(将有数千个)附加到同一个数组。
非常感谢任何帮助。
【问题讨论】:
-
你能详细说明为什么这个问题需要数千个进程吗?您可能会在此之前达到收益递减点,请参阅stackoverflow.com/questions/20039659/…
-
因为这是用于图像应用的,CreateMatrixMp 方法会运行 ((# of pixel)^2) 次。它在每个像素(节点)之间的边缘创建一个权重。
-
除非我不理解这听起来像是通过将图像与内核进行卷积来解决的问题。我仍然不明白为什么需要数千个进程。
-
@paisanco 仅需要数千个进程,因为我想并行化它。该算法循环通过一个专注于单个像素的函数,然后在
for循环中将其与图像中的每个其他像素进行比较,为每个像素分配一个边缘值。然后在每个像素上执行。所以实际上只有(像素数)个进程,因为每个进程循环遍历整个图像。但是,对于成千上万的大图像。 “用内核卷积图像”是什么意思? -
您是否已经考虑过 IPython 的并行映射 (ipython.org/ipython-doc/dev/parallel/…)?
标签: python arrays numpy multiprocessing shared-memory