Matriz de memoria compartida de Python, sin atributo get_obj()

Estoy trabajando en la manipulación de matrices numpy usando el módulo de multiprocesamiento y me encuentro con un problema al probar parte del código que he encontrado aquí. Específicamente, estoy creando una matriz ctypes a partir de una matriz numpy y luego intento devolver la matriz ctypes a una matriz numpy. Aquí está el código:

    shared_arr = multiprocessing.RawArray(_numpy_to_ctypes[array.dtype.type],array.size)

No necesito ningún tipo de bloqueo de sincronización, por lo que estoy usando RawArray. El tipo de datos ctypes se extrae de un diccionario basado en el dtype de la matriz de entrada. Eso está funcionando maravillosamente.

    shared_arr = numpy.ctypeslib.as_array(shared_arr.get_obj())

Aquí obtengo un seguimiento de la pila que indica:

    AttributeError: 'c_double_Array_16154769' object has no attribute 'get_obj'

También he intentado lo siguiente de esta publicación, pero obtiene un error idéntico.

    def tonumpyarray(shared_arr):
        return numpy.frombuffer(shared_arr.get_obj())  

Estoy atascado ejecutando python 2.6 y no sé si ese es el problema, si es un problema compartir el nombre de la variable (estoy tratando de mantener el uso de memoria lo más bajo posible y estoy tratando de no duplicar la matriz numpy y los ctypes matriz en la memoria), o algo más, ya que estoy aprendiendo sobre este componente de python.

Sugerencias

preguntado el 27 de julio de 12 a las 19:07

Debo agregar que realmente no estoy tratando de volver a una matriz numpy, simplemente devuelvo una vista de la matriz ctypes que puedo escribir como una matriz numpy (si entiendo el orden de las operaciones correctamente). -

1 Respuestas

Dado que usa RawArray, es solo una matriz de ctypes asignada desde la memoria compartida. No hay un objeto envuelto, por lo que no necesita el método get_obj() para obtener el objeto envuelto:

>>> shared_arr = multiprocessing.RawArray("d",10)
>>> t = np.frombuffer(shared_arr, dtype=float)
>>> t[0] = 2
>>> shared_arr[0]
2.0

Respondido 30 Jul 12, 05:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.