我处理2个大型一维数组(分别说A和B):我对A和B元素对进行运算,并将结果写入共享数组C(将C视为直方图)。我想使用 multiprocessing 来并行化进程。我认为最佳方法可能是将数组A切片成与我选择要执行的并行进程数量相等的唯一块,然后使用 for 循环对B的所有元素进行数学运算。 / p>
我正在阅读许多问题/答案。我以使用{em> Process 的示例Multiprocessing a loop of a function that writes to an array in python为例。我试图适应我的问题,但是却获得了串行执行的性能。我正在测试的代码:
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,2,3,4,5,6,7,8,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],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)
我会很感激任何输入或暗示我做错了什么。也许还有我不知道的更简单的方法。 谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。