2016-06-28 2 views
0

저는 많은 작업자로 쉽게 나눌 수있는 CPU 비싼 계산을 수행하고 있습니다. 그러나 결국 결과에 합류해야합니다. 문제는 여러 격리 된 프로세스를 사용할 때 공유 메모리를 사용할 수 없으며 자식에서 부모로 계산 된 출력을 보내는 유일한 방법은 multiprocessing.Queue, multiprocessing.Manager 또는 multiprocessing.Pool입니다. 이 모든 접근 방식은 객체를 pickle 처리하고 일종의 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

나는 사전이 문제를 해결할 생각 :

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

당신이 사전을 얻기 위해 사용할 수있는 것보다

. –

+0

사전 어디서? 아이들이 무엇을 반환해야하는지, 또는 목록에 추가해야하는 사전. 그러나 공유 메모리가 없기 때문에 효율적인 방법을 찾을 수 없습니다. 피클은 돌아 오는 사전을 피클 할 때 많은 시간을 필요로합니다. – edgarstack

답변

0
당신이 피클 사전에게 자기를 시도 할 수 있습니다

(그러나 당신이 너무 사용할 수있는 다른 모듈이 있습니다) : 내가 좋아하는 뭔가를 할 수 있도록하고 싶습니다 이 같은 :

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

내 설명에서 나는 이미 그것에 대해 이야기했다. 멀티 스레딩 큐, 파이프 등을 사용하여 사전을 주 프로세스로 전달할 수 있습니다. 이러한 모든 방법은 가져 오려는 개체를 serialize/unserialize합니다. 그러나 내 사전은 커지고 내 프로그램의 병목이됩니다. 공유 메모리에 파이썬리스트를 가지고 싶습니다. (numpy.arrays로 할 수있는 것을 보았습니다. 시도했지만 세그먼트 결함을 얻었습니다.) – edgarstack

+0

나는 이것이 더 빠를 것이라고 생각합니다. 당신의 사전은 크고, 얼마나 커요? – ands

+0

그들은 50MB가 될 수 있으며 사전에 사전이 있습니다. 그것들을 계산하는 것이 하나의 프로세스보다 훨씬 적게 걸린다. 그러나 부모 프로세스가 그것들을 얻으면 그것은 느려지 게되고 전체 프로세스를 요약하는 것이 단일 프로세스를 사용하는 것보다 느리다. 공유 메모리를 사용하는 스레드를 사용하여 사전을 보내면 1ms가 걸리므로 공유 메모리를 사용하면 문제를 완전히 해결할 수 있지만 다중 처리 라이브러리는 사전 목록에 공유 메모리를 제공하지 않습니다. 그렇게. – edgarstack

관련 문제