我正在使用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)
答案 0 :(得分:6)
我认为Dbus不是发送大量数据的最佳方式。
如何将数据结构写入/ tmp中的文件,只是通过dbus在程序之间传递文件名?
答案 1 :(得分:4)
D-bus不允许您为每条消息传递超过128Mb的数据,并且限制通常设置为/etc/dbus-1/session.conf
您正在寻找命名管道。它就像一个临时文件,除了数据没有写入磁盘,而是以非常低的开销从一个进程流式传输到另一个进程。它对数据大小没有限制。 有关详细信息,请参阅http://en.wikipedia.org/wiki/Named_pipe和Create a temporary FIFO (named pipe) in Python?。
答案 2 :(得分:-1)
现在我想到的一个简单的解决方案是分离数据结构。将它分开,发送每个部分并将其连接在另一个程序上。当然,有必要注意确保你能正确加入它。