在dbus上传递大型数据结构

时间:2011-06-02 21:39:02

标签: python dbus

我正在使用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.

我知道这意味着我传递的数组大于允许的数组。还有其他方法可以在dbus中传递大数据结构吗?

这是我正在使用的代码的摘录:

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)

另一方面,我有类似

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

3 个答案:

答案 0 :(得分:6)

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

如何将数据结构写入/ tmp中的文件,只是通过dbus在程序之间传递文件名?

答案 1 :(得分:4)

D-bus不允许您为每条消息传递超过128Mb的数据,并且限制通常设置为/etc/dbus-1/session.conf

中更低的值

您正在寻找命名管道。它就像一个临时文件,除了数据没有写入磁盘,而是以非常低的开销从一个进程流式传输到另一个进程。它对数据大小没有限制。 有关详细信息,请参阅http://en.wikipedia.org/wiki/Named_pipeCreate a temporary FIFO (named pipe) in Python?

答案 2 :(得分:-1)

现在我想到的一个简单的解决方案是分离数据结构。将它分开,发送每个部分并将其连接在另一个程序上。当然,有必要注意确保你能正确加入它。