Python 多处理写入共享字典的最佳实践是什么?



我有数百万个我希望处理的NumPy数组,最终生成一个集体直方图,绘制所见整数的频率。我希望利用并行性来尽可能快地处理这个问题。经过阅读,似乎大多数人都主张multiprocessingmultiprocessing.Manager().dict()一起做这件事。我已经想出了下面的工作代码:

import pickle
import random
import numpy as np
import multiprocessing as mp

# XXX: Placeholder.
id_to_seq = {}
for i in range(100):
id_to_seq[i] = np.random.randint(100, size=random.randint(1, 100))

def process_seq(id, num_frequency):
seq = id_to_seq[id]
for num in seq:
if num in num_frequency:
num_frequency[num] += 1
else:
num_frequency[num] = 1

if __name__ == '__main__':
manager = mp.Manager()
num_frequency = manager.dict()
pool = mp.Pool(mp.cpu_count())
for id in id_to_seq.keys():  # Execute in parallel.
pool.apply_async(process_seq, args=(id, num_frequency))
pool.close()
pool.join()    
with open('num_frequency.pkl', 'wb') as handle:
pickle.dump(dict(num_frequency), handle, protocol=pickle.HIGHEST_PROTOCOL)

然而,考虑到我经常给我的num_frequency字典写信,我想知道这是否是最好的,快速的做法。我担心共享和写入同一字典的开销。(实际上,似乎Manger().dict()甚至在物理上都不共享相同的内存,而是通过向其他副本发送更改信号在语义上共享内存。)有人能告诉我减少开销和运行时的最佳多处理实践吗?

通常的、简单的方法是使本地每个进程的计数字典,然后在每个进程退出时合并它们。您可以选择减少每个调用如果此类调用的数量远远小于要计数的元素总数,则为简单起见,改为process_seq

相关内容

最新更新