2016-06-28 173 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