2014-03-26 56 views
7

以下是我使用多處理的示例程序。計算使用multiprocessing.Process完成,結果使用multiprocessing.Queue收集。多處理:PyObject_Call中沒有錯誤的NULL結果

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

以下是錯誤消息:

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,這是一個錯誤。但我無法理解。 任何人都可以告訴我任何方式來計算使用多處理的巨大數據?

非常感謝您

回答

4

的bug報告參考指出多處理模塊是無法推動巨大的參數子。

原因是它需要醃製這些參數並將醃漬的斑點存儲在內存中的某處。

但是,您不需要將數組作爲參數傳遞。

可能的原因:

  • 傳遞一個封閉loop作爲目標
  • 傳遞mp.Queue()作爲參數

請參閱http://stevenengelhardt.com/2013/01/16/python-multiprocessing-module-and-closures/你的閉合轉換爲一類。

在對多處理進行控制之前設置完整狀態。

+1

問題是OP試圖通過'multiprcessing.Queue'放置一個2.56 GB的Numpy數組。這仍然是一個相當大的數量,可能會耗盡內存或不被酸模組所支持。 – 2015-09-14 17:20:23

+0

Python 3修復了大醬菜的一些問題,所以如果可以的話,你可以嘗試一下。 –

相關問題