2017-10-30 8 views
0

파이썬 코드는 많은 읽기 연산이 수행되는 거대한 해시 테이블 (60GB +)을 생성한다. 작업 속도를 높이려면 각 작업을 동시에 수행 할 수 있도록 해시 테이블을 만든 후 (48 코어 시스템) 프로세스를 몇 번 포크하십시오.파이썬은 모든 fork 된 프로세스가 완료 될 때까지 기다린다.

일단 모든 fork 된 자식들이 자신의 결과를 병합하고 싶다면 부모 프로세스가 하나 이상의 PID를 기다릴 수있는 방법이 필요합니다. 어떻게해야합니까?

풋 프린트를 줄이기 위해 fork 된 프로세스의 메모리 페이지가 상위 주소 공간에 매핑되기 때문에 포킹이 핵심적인 부분입니다. 해시 테이블은 다른 라이브러리에 의해 생성되므로 해당 구현을 수정하는 것은 옵션이 아닙니다.

children = [] 
for index in batch: 
    tracks = batch[index] 
    pid = os.fork() 
    if pid == 0: 
     # forked process 
     run_batch(tracks, index) 
    else: 
     # main process 
     children.append(pid) 
     print('spawned child ', pid) 
+0

단순히'os.wait'을 사용하십시오. – Daniel

+0

@Daniel 작동하지 않습니다. 'os.wait'는 하나의 프로세스 만 기다리고, 적어도 12는 있습니다. – DarthPaghius

+0

주문을 중계하지 않습니다. 설명해주세요. 왜 '대기'를 사용할 수 없습니까? – Daniel

답변

0

은 아마 문제가 잘못된 가지고,하지만 난이 개 간단한 솔루션 참조 : 사전에 알고있는 경우, 총있을 것입니다 얼마나 많은 작업, 당신은 당신의 테이블에 쓰기를 결합 할 수

카운터를 보강과를 . 병합 기능은 카운터가 특정 숫자에 도달 할 때까지 잠자기 상태가됩니다.

또 다른 클리너 방식은 celery입니다.

먼저 조작을 병렬화해야하는 group이 필요하고 병합 기능이있는 그룹 chain이 필요합니다.

이렇게하면 그룹의 모든 작업이 체인의 첫 번째 부분으로 병렬 처리되고 그룹의 모든 작업이 완료되면 체인의 두 번째 부분 인 병합이 활성화됩니다.

+0

당신이 정말로 문제를 잘못 생각한 것 같습니다. 해시 테이블이 완전히 작성되면 하위 작업이 포크됩니다. 또한 프로세스 당 60GB를 사용하지 않으려면 fork 할 필요가 있습니다. 셀러리는 그렇게하지 않습니다. – DarthPaghius