相关疑难解决方法(0)

使用多处理Pool.map()时无法pickle <type'instancemethod'>

我想使用multiprocessingPool.map()功能,同时划分出工作.当我使用以下代码时,它工作正常:

import multiprocessing

def f(x):
    return x*x

def go():
    pool = multiprocessing.Pool(processes=4)        
    print pool.map(f, range(10))


if __name__== '__main__' :
    go()
Run Code Online (Sandbox Code Playgroud)

但是,当我在面向对象的方法中使用它时,它不起作用.它给出的错误信息是:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)

当以下是我的主程序时会发生这种情况:

import someClass

if __name__== '__main__' :
    sc = someClass.someClass()
    sc.go()
Run Code Online (Sandbox Code Playgroud)

以下是我的someClass课程:

import multiprocessing

class someClass(object):
    def __init__(self):
        pass

    def f(self, x):
        return x*x

    def go(self):
        pool = multiprocessing.Pool(processes=4)       
        print pool.map(self.f, range(10))
Run Code Online (Sandbox Code Playgroud)

任何人都知道问题可能是什么,或者一个简单的方法呢?

python multithreading pool pickle multiprocessing

206
推荐指数
6
解决办法
12万
查看次数

如何在Python中的多进程中解决"AttributeError:__ exit__"问题?

我试图重写一些csv读取代码,以便能够在Python 3.2.2中的多个核心上运行它.我尝试使用Pool多处理的对象,我从工作示例改编(并且已经为我的项目的另一部分工作).我遇到了一条错误消息,我发现很难解密和排除故障.

错误:

Traceback (most recent call last):
  File "parser5_nodots_parallel.py", line 256, in <module>
    MG,ppl = csv2graph(r)
  File "parser5_nodots_parallel.py", line 245, in csv2graph
    node_chunks)
  File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 552, in get
    raise self._value
AttributeError: __exit__
Run Code Online (Sandbox Code Playgroud)

相关代码:

import csv
import time
import datetime
import re
from operator import itemgetter
from multiprocessing import Pool
import itertools

def chunks(l,n):
    """Divide a list of nodes `l` in `n` chunks"""
    l_c = iter(l)
    while …
Run Code Online (Sandbox Code Playgroud)

python pool multiprocessing python-3.x

84
推荐指数
3
解决办法
9万
查看次数

在python中的进程之间共享连续的numpy数组

虽然我找到了类似于我的问题的许多答案,但我不相信它已经直接在这里解决了 - 我还有几个问题.共享连续numpy数组的动机如下:

  • 我正在使用在Caffe上运行的卷积神经网络对一系列连续值标签执行图像回归.
  • 图像需要特定的预处理和数据增强.
  • 约束(1)标签的连续性(它们是浮点数)和(2)数据扩充意味着我在python中预处理数据,然后使用内存数据将其作为连续的numpy数组提供Caffe中的一层.
  • 将训练数据加载到内存中相对较慢.我想将它并行化,以便:

(1)我正在编写的python创建了一个"数据处理程序"类,它实例化了两个连续的numpy数组.(2)工作进程在这些numpy数组之间交替,从磁盘加载数据,执行预处理,以及将数据插入numpy数组.(3)同时,python Caffe包装器将数据从另一个阵列发送到GPU以通过网络运行.

我有几个问题:

  1. 是否有可能在连续的numpy数组中分配内存然后将它包装在共享内存对象中(我不确定'对象'是否是正确的术语)使用类似python多处理的Array类?

  2. Numpy数组有一个.ctypes属性,我认为这对于从Array()实例化共享内存数组很有用,但似乎无法确切地确定如何使用它们.

  3. 如果在没有 numpy数组的情况下实例化共享内存,它是否保持连续?如果没有,有没有办法确保它保持连续?

有可能做这样的事情:

import numpy as np
from multiprocessing import Array
contArr = np.ascontiguousarray(np.zeros((n_images, n_channels, img_height, img_width)), dtype=np.float32)
sm_contArr = Array(contArr.ctypes.?, contArr?)
Run Code Online (Sandbox Code Playgroud)

然后用实例化实例化

p.append(Process(target=some_worker_function, args=(data_to_load, sm_contArr)))
p.start()
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:我知道有许多库在不同的维护状态下具有类似的功能.我宁愿将此限制为纯python和numpy,但如果这不可能,我当然愿意使用它.

python numpy shared-memory multiprocessing caffe

22
推荐指数
1
解决办法
1993
查看次数

可拾取图像对象

如何从PIL Image对象创建一个pickleable文件,以便您可以将这些图像保存为单个pickle文件,然后上传到另一台计算机,例如运行PIL的服务器并在那里取消它?

python pickle python-imaging-library

9
推荐指数
2
解决办法
4890
查看次数