如何让多个并行进程对单个共享 NumPy 数组进行更改?
How can I make many perallel processes make changes to a single shared NumPy array?
我已经在互联网上搜索了答案,但没有找到适合我情况的答案。我读过 multiprocessing.Manager
,尝试过来回传递东西,none 似乎与 NumPy arrays.I 一起玩得很好,我尝试过使用 Pool
,但我的目标方法不 return 任何东西,它只是对数组进行更改,所以我也不确定如何设置它。
现在我有:
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
方法的详细信息有帮助,我也可以 post。
我试着在上面添加这个过程是 运行:
mgr = mp.Manager()
sharedData = mgr.Array(ctypes.c_numpy.float64, self.data)
然后把sharedData
传给CreateMatrixMp
,这里可以修改。一旦所有进程都具有 运行 并且数组已完成,我只需执行 self.data = sharedData
.
但这不起作用(虽然我知道我没有正确设置它)。这应该如何用 NumPy 数组来完成?我希望每个进程(将有数千个)附加到同一个数组。
非常感谢任何帮助。
欢迎来到多线程的黑暗世界。我认为这里的大问题是 mgr.Array 使数组同步。如果您快速生成数据,这将是一个瓶颈,因为进程将等待最后一个完成数组。如果每个进程保留 num 数组的私有副本,它会更有效率并且会有所帮助。输入所有数据后,等待所有过程完成。然后你可以将所有数组组合成self.data。这样 none 的已处理需要等待共享资源。此解决方案和您的解决方案都不能保证输出列表的顺序。我从 self.numPixels 怀疑顺序可能很重要。许多解决方案,但最简单的是按顺序提供数据并在完成后执行 self.data.sort(...) 。或者更快,预创建 self.data 并让进程在正确的位置戳结果。 self.data 不需要是共享数据结构,因为进程永远不会改变任何共同点。如果数组映射到类似 C 的数组,则此方法有效。它不适用于链接列表等。希望这会有所帮助。询问您是否需要更多详细信息。
我已经在互联网上搜索了答案,但没有找到适合我情况的答案。我读过 multiprocessing.Manager
,尝试过来回传递东西,none 似乎与 NumPy arrays.I 一起玩得很好,我尝试过使用 Pool
,但我的目标方法不 return 任何东西,它只是对数组进行更改,所以我也不确定如何设置它。
现在我有:
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
方法的详细信息有帮助,我也可以 post。
我试着在上面添加这个过程是 运行:
mgr = mp.Manager()
sharedData = mgr.Array(ctypes.c_numpy.float64, self.data)
然后把sharedData
传给CreateMatrixMp
,这里可以修改。一旦所有进程都具有 运行 并且数组已完成,我只需执行 self.data = sharedData
.
但这不起作用(虽然我知道我没有正确设置它)。这应该如何用 NumPy 数组来完成?我希望每个进程(将有数千个)附加到同一个数组。
非常感谢任何帮助。
欢迎来到多线程的黑暗世界。我认为这里的大问题是 mgr.Array 使数组同步。如果您快速生成数据,这将是一个瓶颈,因为进程将等待最后一个完成数组。如果每个进程保留 num 数组的私有副本,它会更有效率并且会有所帮助。输入所有数据后,等待所有过程完成。然后你可以将所有数组组合成self.data。这样 none 的已处理需要等待共享资源。此解决方案和您的解决方案都不能保证输出列表的顺序。我从 self.numPixels 怀疑顺序可能很重要。许多解决方案,但最简单的是按顺序提供数据并在完成后执行 self.data.sort(...) 。或者更快,预创建 self.data 并让进程在正确的位置戳结果。 self.data 不需要是共享数据结构,因为进程永远不会改变任何共同点。如果数组映射到类似 C 的数组,则此方法有效。它不适用于链接列表等。希望这会有所帮助。询问您是否需要更多详细信息。