python - 多处理 : NULL result without error in PyObject_Call

标签 python numpy multidimensional-array queue multiprocessing

这是我使用多处理的示例程序。计算是使用 multiprocessing.Process 完成的,结果是使用 multiprocessing.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)

这是错误信息:

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这是一个错误。但是我无法理解。 谁能告诉我使用多处理计算大量数据的任何方法?

非常感谢

最佳答案

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

原因是它需要腌制这些参数并将腌制过的 blob 存储在内存中的某个位置。

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

可能的原因:

  • 将闭包 loop 作为目标传递
  • mp.Queue() 作为参数传递

请参阅http://stevenengelhardt.com/2013/01/16/python-multiprocessing-module-and-closures/关于将闭包转换为类。

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

关于python - 多处理 : NULL result without error in PyObject_Call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22656285/

相关文章:

javascript - 将简单数组转换为二维数组(矩阵)

python - 唯一字典列表

python - 将这两个向量相乘的大多数 Pythonic 方法?

python - 使用 ctypes 时释放内存

PHP:json_encode() 不显示多维数组的任何内容

go - 在 golang 的 map 中使用 string[][] 时复合文字中缺少类型

python - 使用 python 格式解析 BLAST.xml 需要小写字符串

python - Pandas df.index.strftime ('%H' )

python - 在 2d 绘图上投影 3d 曲面

python - 如何检查我使用的是哪个版本的 NumPy?