通过dbus传递大型数据结构

6 投票
3 回答
6762 浏览
提问于 2025-04-16 18:52

我正在使用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 个回答

-1

我现在想到的一个简单解决办法就是把数据结构分开。把它分开后,发送每一部分,然后在另一个程序里把它们合在一起。当然,这样做的时候需要小心,确保你能把它们正确地组合在一起。

5

D-bus不允许你每条消息传递超过128Mb的数据,而且这个限制在/etc/dbus-1/session.conf文件中通常会设置得更低。

你需要的是命名管道。它就像一个临时文件,但数据并不是写入硬盘,而是以非常低的开销从一个进程流向另一个进程。它对数据大小没有限制。

想了解更多,可以查看这个维基百科页面这个关于如何在Python中创建临时FIFO(命名管道)的帖子

8

我觉得 Dbus 其实不是传输大量数据的最佳方式。

不如把数据结构写到一个临时文件里,然后通过 Dbus 在程序之间传递这个文件名呢?

撰写回答