Python 通过dbus传递大型数据结构

Python 通过dbus传递大型数据结构,python,dbus,Python,Dbus,我正在使用dbus与两个程序进行通信。一个创建一个大图像,然后将其发送到另一个程序进行进一步处理。我传递的图像是ByteArray 对于2000x2000图像,我的程序可以工作,但对于4000x4000图像,它会崩溃: process 2283: arguments to dbus_message_iter_append_fixed_array() were incorrect,assertion "n_elements <= DBUS_MAXIMUM_ARRAY_LENGT

我正在使用dbus与两个程序进行通信。一个创建一个大图像,然后将其发送到另一个程序进行进一步处理。我传递的图像是ByteArray

对于2000x2000图像,我的程序可以工作,但对于4000x4000图像,它会崩溃:

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.
另一方面,我有一些

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

我现在想到的一个简单的解决方案是分离数据结构。。将其分开,发送每个片段,并在另一个程序中将其连接在一起。当然,要确保正确加入它,一定要小心。

我认为Dbus并不是发送大量数据的最佳方式


将数据结构写入/tmp中的文件,然后通过dbus在程序之间传递文件名,怎么样?

D-bus不允许您在每条消息中传递超过128Mb的数据,并且在
/etc/dbus-1/session.conf

您正在寻找的是命名管道。它类似于一个临时文件,只是数据不会写入磁盘,而是以非常低的开销从一个进程流到另一个进程。它对数据大小没有限制。
有关详细信息,请参阅和。

+1 DBU用于传递小消息,而不是流式传输大量数据。临时文件或某种共享内存可能是最好的选择。DBU应该向大数据块(临时文件、共享内存区域)发送句柄,而不是数据本身。为了澄清和强调9000所说的,D-Bus提供了一种在D-Bus消息中传递文件描述符的工具,这比传递文件名更好,因为您可以传递只读文件描述符,或者将句柄传递给未命名的管道。文件描述符的类型是
h
。为了澄清这一点:D-Bus明确地被用作一个用于小的、低延迟控制消息的消息传递系统(在网络术语中称为“控制平面”)。它不适用于大消息的高带宽传输(“数据平面”)。它明确提供了一种在对等方之间传输文件描述符(D-Bus类型
h
)的方法,因此D-Bus消息传递可用于设置进程间管道以进行高带宽数据传输。这是一个坏主意,因为这样最终会通过总线发送更多数据(与其他方式相同的数据量,加上额外的消息头)。
def store_image(self, bindata):
    # Convert binary data back to HDUList
    handle = StringIO.StringIO(bindata)
    hdulist = pyfits.open(handle)