7

다음은 다중 처리를 사용하는 샘플 프로그램입니다. 계산은 multiprocessing.Process으로 수행되고 결과는 multiprocessing.Queue을 사용하여 수집됩니다. 다중 처리 : PyObject_Call에서 오류없이 NULL 결과

Traceback (most recent call last): 
    File "/usr/lib/python2.7/multiprocessing/queues.py", line 266, in _feed 
    send(obj) 
SystemError: NULL result without error in PyObject_Call 

내가 그것을 버그라고 here을 읽어 여기에
#THIS PROGRAM RUNS WITH ~40Gb RAM. (you can reduce a,b,c for less RAM 
#but then it works for smaller values) 
#PROBLEM OCCURS ONLY FOR HUGE DATA. 
from numpy import * 
import multiprocessing as mp 

a = arange(0, 3500, 5) 
b = arange(0, 3500, 5) 
c = arange(0, 3500, 5) 
a0 = 540. #random values 
b0 = 26. 
c0 = 826. 
def rand_function(a, b, c, a0, b0, c0): 
    Nloop = 100. 
    def loop(Nloop, out): 
     res_total = zeros((700, 700, 700), dtype = 'float') 
     n = 1 
     while n <= Nloop: 
      rad = sqrt((a-a0)**2 + (b-b0)**2 + (c-c0)**2) 
      res_total += rad 
      n +=1 
     out.put(res_total) 
    out = mp.Queue() 
    jobs = [] 
    Nprocs = mp.cpu_count() 
    print "No. of processors : ", Nprocs 
    for i in range(Nprocs): 
     p = mp.Process(target = loop, args=(Nloop/Nprocs, out)) 
     jobs.append(p) 
     p.start() 

    final_result = zeros((700, 700, 700), dtype = 'float') 

    for i in range(Nprocs): 
     final_result = final_result + out.get() 

    p.join() 
test = rand_function(a,b,c,a0, b0, c0) 

는 오류 메시지입니다. 그러나 나는 이해할 수 없다. 누구나 멀티 프로세싱을 사용하여 거대한 데이터를 계산할 수있는 방법을 알려주시겠습니까?

매우

답변

4

모듈을 멀티 프로세싱하는 서브 프로세스에 큰 인수를 추진 할 수없는 버그 리포트 참조 상태를 주셔서 감사합니다.

이유는 이러한 인수를 피클 링하고 절인 된 BLOB를 메모리 어딘가에 저장해야하기 때문입니다.

그러나 사용자는 배열을 인수로 전달할 필요가 없습니다.

가능한 원인 :

클래스에 폐쇄를 변환하는 방법에 대한 http://stevenengelhardt.com/2013/01/16/python-multiprocessing-module-and-closures/를 참조하시기 바랍니다 인수로 mp.Queue()을 통과하는 대상

  • 으로 폐쇄 loop을 전달합니다.

    멀티 프로세싱을 제어하기 전에 전체 상태를 설정하십시오.

  • +1

    OP는'multiprcessing.Queue'를 통해 2.56GB Numpy 배열을 넣으려고합니다. 이것은 여전히 ​​상대적으로 많은 양이며 메모리가 부족하거나 피클 모듈에 의해 지원되지 않을 수 있습니다. –

    +0

    Python 3은 대형 절임과 관련된 몇 가지 문제점을 수정하므로 가능한 경우 시도해보십시오. –