Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理:PyObject_调用中无错误的空结果_Python_Numpy_Multidimensional Array_Queue_Multiprocessing - Fatal编程技术网

Python 多处理:PyObject_调用中无错误的空结果

Python 多处理:PyObject_调用中无错误的空结果,python,numpy,multidimensional-array,queue,multiprocessing,Python,Numpy,Multidimensional Array,Queue,Multiprocessing,这是一个我使用多处理的示例程序。使用多处理.Process完成计算,并使用多处理.Queue收集结果 #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

这是一个我使用多处理的示例程序。使用
多处理.Process
完成计算,并使用
多处理.Queue
收集结果

#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)
我读到这是一个错误。但我无法理解。 有谁能告诉我使用多重处理计算巨大数据的方法吗


非常感谢

您参考的错误报告指出,多处理模块无法将大参数推送到子进程

原因是它需要对这些参数进行pickle,并将pickle后的blob存储在内存中的某个位置

但是,您不需要将数组作为参数传递

可能的原因:

  • 作为目标传递闭包
    循环
  • mp.Queue()作为参数传递
请参阅如何将闭包转换为类


在控制多处理之前,请设置完整状态。

问题是,OP试图通过
多处理队列放置2.56 GB的Numpy数组。
。这仍然是一个相对较大的数量,可能会耗尽内存,或者pickle模块不支持它。Python 3修复了大型pickle的一些问题,因此如果可以,您可以尝试一下。
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