如何将类作为参数传递给Pool.map - Pickling Error

时间:2017-08-23 10:06:17

标签: python python-3.x multiprocessing anaconda pickle

我试图通过将文件切割成块并通过处理块的函数运行它们来处理文件并返回一个numpy数组。环顾四周之后,似乎最好的方法是通过将类作为参数传递来使用Pool.map方法。这些类是以块部分作为变量启动的,另一个是用于存储numpy数组的变量。然后可以解析类的输出列表以获取继续解决问题所需的信息。这是我试图编写的脚本的简化版本:

from multiprocessing import Pool

class container():

    def __init__(self, k):
        self.input_section = k
        self.ouput_answer = 0

def compute(object_class):
    # Main operation would go on in here....

    object_class.output_answer = object_class.input_section
    return object_class

def Main():

    # Create list of classes to path as arguments
    sections = [container(k) for k in range(10)]

    # Create pool and compute modified classes
    with Pool(4) as p:
        results = p.map(compute, sections)

    # Decode here to get answers
    sections = [k.output_answer for k in results]

    # Print answers
    print(sections)

if __name__ == '__main__':
    Main()

这是我运行脚本时遇到的错误:

  

线程中的异常Thread-9:Traceback(最近一次调用最后一次):

File "C:\Users\rbernon\AppData\Local\Continuum\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner
 self.run()   
File "C:\Users\rbernon\AppData\Local\Continuum\Anaconda3\lib\threading.py",  line 864, in run
 self._target(*self._args, **self._kwargs)   
File "C:\Users\rbernon\AppData\Local\Continuum\Anaconda3\lib\multiprocessing\pool.py", line 463, in _handle_results
 task = get()   
File "C:\Users\rbernon\AppData\Local\Continuum\Anaconda3\lib\multiprocessing\connection.py", line 251, in recv
 return _ForkingPickler.loads(buf.getbuffer()) 
AttributeError: Can't get attribute 'container' on module '__main__' from
    'C:\\Users\\rbernon\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\spyder\\utils\\ipython\\start_kernel.py'>

任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:1)

请记住,您希望处理的每一段数据都需要被腌制并发送给工作进程。

这样做的开销将减少(甚至可能消除)使用多个进程的优势。

如果数据文件很大,最好将每个工作人员的开始和结束偏移量作为2元组数字发送,这样每个工作人员都可以读取部分文件并进行处理。