我正在使用多处理来执行迭代参数的函数。 对于参数中过于冗长的数组,我收到以下错误消息:
<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),但解决方案只适用于特殊情况,我一般都不知道如何应用它。
有谁知道如何修复错误?
答案 0 :(得分:0)
不幸的是,如果您已经引用的答案对您不起作用,我认为您不会找到允许您使用当前方法的其他解决方法。 Here is a conversation介于几个Python开发人员讨论多处理库的大小限制之后,似乎并没有达到一个好的解决方案。看来,如果不修改Python本身就没有“修复”的大小限制。
即使现在已经改变了,它(很可能)也不会被反向移植到Python 2.7。
我认为你有一些潜在的解决方案:
在您的工作人员功能中拆分您的返回数据,然后将其返回queue。您可能需要使用更像apply_async而不是map
的函数。这样您就可以在任何时候控制您尝试在进程之间推送的数据大小。
使用mmap库并将结果写入我在主过程中设置的某个共享内存。
如果你想要的东西尽可能简单并且不太担心速度,你可以简单地将你的结果写到文本文件中,返回文件名,然后在你的文本中读回来。主要过程。