Pasando una gran estructura de datos sobre dbus

Estoy usando dbus para comunicar dos progtwigs. Uno crea una imagen grande y luego le envía otro progtwig para su procesamiento posterior. Estoy pasando la imagen como ByteArray.

Con 2000×2000 imágenes mi progtwig funciona, pero con 4000×4000 falla con:

process 2283: arguments to dbus_message_iter_append_fixed_array() were incorrect,assertion "n_elements <= DBUS_MAXIMUM_ARRAY_LENGTH / _dbus_type_get_alignment (element_type)" failed in file dbus-message.c line 2628. 

Entiendo que esto significa que estoy pasando una matriz más grande de lo permitido. ¿Hay otra forma de pasar grandes estructuras de datos en dbus?

Este es un extracto del código que estoy usando:

 handle = StringIO() # hdulist contains the large data structure hdulist.writeto(handle) hdub = dbus.ByteArray(handle.getvalue()) # this sends the image via dbus self.dbi.store_image(hdub) 

En el otro extremo tengo algo como

 def store_image(self, bindata): # Convert binary data back to HDUList handle = StringIO.StringIO(bindata) hdulist = pyfits.open(handle) 

No creo que Dbus sea realmente la mejor manera de enviar grandes cantidades de datos.

¿Qué hay de escribir la estructura de datos en un archivo en / tmp, y simplemente pasar el nombre de archivo entre los progtwigs a través de dbus?

D-bus no le permitirá pasar más de 128 MB de datos por mensaje, y el límite generalmente se establece en un valor aún menor en /etc/dbus-1/session.conf

Una tubería con nombre es lo que estás buscando. Es como un archivo temporal, excepto que los datos no se escriben en el disco, sino que se transmiten de un proceso a otro con una sobrecarga muy baja. No tiene límites en el tamaño de los datos. ¿Visite http://en.wikipedia.org/wiki/Named_pipe y cree un FIFO temporal (pipe con nombre) en Python? para detalles.

Una solución simple que me viene a la mente en este momento es separar la estructura de datos. Sepárela, envíe cada pieza y únalas en el otro progtwig. Por supuesto, sería necesario tener cierto cuidado para asegurarse de que se uniría correctamente.