7

Hier ist ein Beispielprogramm, wo ich Multiprocessing verwenden. Die Berechnungen werden mit multiprocessing.Process durchgeführt und die Ergebnisse werden unter Verwendung von multiprocessing.Queue gesammelt. HierMultiprocessing: NULL Ergebnis ohne Fehler in PyObject_Call

#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) 

ist die Fehlermeldung:

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 

ich here gelesen, dass es ein Fehler ist. Aber ich kann es nicht verstehen. Kann mir bitte jemand einen Ausweg geben, um riesige Datenmengen mit Multiprocessing zu berechnen?

Vielen Dank

Antwort

4

Der Fehlerbericht Ihrer Referenzzustände, die Modul Multiprozessing ist nicht in der Lage große Argumente subprocess zu schieben.

Der Grund ist, dass es diese Argumente pickle und den gebeizten Blob irgendwo im Speicher speichern muss.

Sie müssen Arrays jedoch nicht als Argumente übergeben.

Mögliche Ursachen:

  • einen Verschluss loop als Ziel
  • vorbei mp.Queue() als Argument

Bitte sehen http://stevenengelhardt.com/2013/01/16/python-multiprocessing-module-and-closures/ vorbei über Ihre Schließung einer Klasse zu konvertieren.

Richten Sie den vollständigen Status ein, bevor Sie Multiprozessing steuern.

+1

Das Problem ist OP versucht, eine 2,56 GB Numpy Array durch die 'multiprocessing.Queue' zu ​​setzen. Dies ist immer noch eine relativ große Menge und kann nicht genügend Arbeitsspeicher haben oder vom Beizmodul nicht unterstützt werden. –

+0

Python 3 behebt einige Probleme mit großen Gurken, also könntest du es versuchen, wenn du kannst. –

Verwandte Themen