2016-06-28 61 views
0

我正在做一个CPU昂贵的计算,可以很容易地分成许多工人。但是,我必须在最后加入结果。的问题是,不能使用使用多个分离的过程时发送从子到父计算机输出的唯一方法是使用multiprocessing.Queuemultiprocessing.Managermultiprocessing.Pool共享内存和。所有这些方法腌制物体并使用某种IPC发送它。将多个字典返回给父处理多处理

我计时操作的所有不同部分,和处理数据与处理方式更快,但是得到的对象是太慢了,它总是更快,如果我不使用多。

有没有办法实现共享内存使用我们当multithreading library得到相同级别的?我希望能够做一些事情,如:,我建议使用该萝模块

process = [None]*numProcess 
#List where the processes should write in memory the output. 
results = [None]*numProcess 
m = float(len(nflow))/numProcess 
nflow_for_process = [nflow[int(m*i):int(m*(i+1))] for i in range(numProcess)] 


for i in xrange(numProcess): 
    p = Process(target=self.gatherFlowsProcess, args=(nflow_for_process[i])) 
    p.daemon = True 
    processes.append(p) 
    p.start() 

#here I join all the results again. 
results_tmp = results[0] 
for d in results[1:]: 
    for tuple in d: 
     if results_tmp.has_key(tuple): 
      results_tmp[tuple].update(d[tuple]) 
     else: 
      results_tmp[tuple] = d[tuple] 


return results_tmp 
+0

我觉得词典解决您的问题。 –

+0

字典在哪里?一本字典,它的孩子必须返回,或将其追加到列表中。然而,由于他们没有共享内存,我找不到一个有效的方法来做到这一点。 Pickle需要大量的时间来腌制返回的字典。 – edgarstack

回答

0

你可以尝试泡菜字典你的自我(但也有其他模块,您可以使用太多),所以它看起来会是像这样:

import dill as pickle 
dic = {...} 
f = open('save.pkl', 'wb') 
g = pickle.dump(dic, f) 
f.close() 

比你可以用它来得到解释:

f = open('save.pkl', 'rb') 
c = pickle.load(f) # c is now equal to dic 
f.close() 
+0

在我的描述中,我已经谈论过这个。您可以使用多线程队列,管道等将字典传递给主进程。所有这些方法都会序列化/反序列化要获取的对象。但是,我的字典很大,而且这成为我程序的瓶颈。我想在共享内存中有一个Python列表(我已经看到它可以用numpy.arrays完成,我试过但我得到了分段错误) – edgarstack

+0

我明白了,我只是说这可能会更快,当你说你的字典很大,有多大? – ands

+0

他们可以是50MB,他们有字典里面的字典。计算它们的速度要比使用一个进程要快得多,但是当父进程得到它们时,它变得非常慢,总结整个事情比使用单个进程要慢。如果我使用使用共享内存的线程发送字典,它需要1ms,所以对于共享内存,我完全可以解决问题,但多处理lib不会为字典列表提供共享内存......并且我还没有找到任何可以去做。 – edgarstack