通过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 个回答
-1
我现在想到的一个简单解决办法就是把数据结构分开。把它分开后,发送每一部分,然后在另一个程序里把它们合在一起。当然,这样做的时候需要小心,确保你能把它们正确地组合在一起。
5
D-bus不允许你每条消息传递超过128Mb的数据,而且这个限制在/etc/dbus-1/session.conf
文件中通常会设置得更低。
你需要的是命名管道。它就像一个临时文件,但数据并不是写入硬盘,而是以非常低的开销从一个进程流向另一个进程。它对数据大小没有限制。
想了解更多,可以查看这个维基百科页面和这个关于如何在Python中创建临时FIFO(命名管道)的帖子。
8
我觉得 Dbus 其实不是传输大量数据的最佳方式。
不如把数据结构写到一个临时文件里,然后通过 Dbus 在程序之间传递这个文件名呢?