【发布时间】:2020-08-14 21:08:03
【问题描述】:
我处理 2 个大型一维数组(假设 A 和 B):我对 A 和 B 元素对进行操作,并将结果写入共享数组 C(将 C 视为直方图)。我想使用 multiprocessing 来并行化这个过程。我认为最佳方法可能是将数组 A 分割成多个独特的块,这些块等于我选择执行的并行进程的数量,并使用 for 循环对 B 的所有元素进行数学运算。
我正在阅读许多问题/答案。我以Multiprocessing a loop of a function that writes to an array in python 为例,它使用了Process。我试图适应我的问题,但我正在获得串行执行的性能。我正在测试的代码:
from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Array
import numpy as np
import time
def ProcessData(sub_data1, data2, freq):
for dat1 in sub_data1:
for dat2 in data2:
d = int( np.sqrt( (dat1 - dat2)**2 ) )
#d = int(dat1 - dat2)
if (d < len(freq)):
freq[d] += 1
def SplitList(data, n):
sub_len = divmod(len(data),n)[0]
print(sub_len)
slices = []
for i in range(n):
slices.append( data[i*sub_len:i*sub_len+sub_len] )
return slices
def main(nproc):
print("Number of cpu : ", mp.cpu_count())
lock = Lock()
N = 30
chip = [1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,9,9,9,9]
data1 = np.array( chip * N )
data2 = np.array( chip * N )
freq = Array('i', 100, lock=lock)
dat1_subs = SplitList(data1,nproc)
print('Number of data1 slices {:d}'.format(len(dat1_subs)))
t_start = time.time()
if __name__ == '__main__':
for i in range(0, nproc):
print('LEN {:d}: {:d}'.format(i, len(dat1_subs[i] )) )
p = Process(target=ProcessData, args=(dat1_subs[i], data2, freq))
p.start()
p.join()
t_end = time.time()
print('Total time (s)= ' + str(t_end - t_start))
print(str(list(freq)))
#new_array = np.frombuffer(freq.get_obj())
Sum = sum( list(freq) )
print('Total {:d}'.format(Sum))
NProc = 4
main(NProc)
我将不胜感激任何输入或提示我做错了什么。或者也许有更简单的方法我只是不知道。 谢谢。
【问题讨论】:
-
没有并行性:您启动一个进程,然后等待它完成,然后再启动另一个进程。更典型:构建
Process对象的列表,then 循环该列表到.start()所有这些,then 再次循环该列表到.join()他们。 -
共享数组(累积计数的“freq”)在使用不同数量的 cpu 处理后在某些绑定中的计数略有不同的原因是什么?
标签: python arrays loops multiprocessing pool