多处理中的SystemError

时间:2015-04-23 08:16:07

标签: python python-2.7 caching multiprocessing python-multiprocessing

我正在使用多处理来执行迭代参数的函数。 对于参数中过于冗长的数组,我收到以下错误消息:

<multiprocessing.pool.Pool object at 0x545912490>
Exception in thread Thread-2:
Traceback (most recent call last):
  File   "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
put(task)
SystemError: NULL result without error in PyObject_Call

我尝试将数组样本与另一个数组样本进行比较。 代码是:

import numpy as np
import multiprocessing

def func(args):
    i=args[0]
    array=args[1]
    sample=args[2]
    for j in np.arange(len(sample)):
        temp=0
        for element in array:
            temp+=len(np.where(sample[j]==element)[0])
    if temp==len(array):
        print i,j       #indices of identical arrays in the samples
    return 0

def compare_samples(a,b):
    iter=len(a)
    pool=multiprocessing.Pool()
    iter_args=[]
    for i in range(0,iter):
        iter_args.append([i,a[i],b])
    print pool
    pool.map(func,iter_args)
    return 0

N=100000000       #error if this number is too large
sample1=np.random.random_integers(0,9,size=(N,10))
sample2=np.random.random_integers(0,9,size=(N,10))

compare_samples(sample1,sample2)

我发现了一个类似的问题(System error while running subprocesses using Multiprocessing),但解决方案只适用于特殊情况,我一般都不知道如何应用它。

有谁知道如何修复错误?

1 个答案:

答案 0 :(得分:0)

不幸的是,如果您已经引用的答案对您不起作用,我认为您不会找到允许您使用当前方法的其他解决方法。 Here is a conversation介于几个Python开发人员讨论多处理库的大小限制之后,似乎并没有达到一个好的解决方案。看来,如果不修改Python本身就没有“修复”的大小限制。

即使现在已经改变了,它(很可能)也不会被反向移植到Python 2.7。

我认为你有一些潜在的解决方案:

  1. 在您的工作人员功能中拆分您的返回数据,然后将其返回queue。您可能需要使用更像apply_async而不是map的函数。这样您就可以在任何时候控制您尝试在进程之间推送的数据大小。

  2. 使用mmap库并将结果写入我在主过程中设置的某个共享内存。

  3. 如果你想要的东西尽可能简单并且不太担心速度,你可以简单地将你的结果写到文本文件中,返回文件名,然后在你的文本中读回来。主要过程。