Передача большой структуры данных через dbus - PullRequest
5 голосов
/ 03 июня 2011

Я использую 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 ]

6 голосов
/ 03 июня 2011

Я не думаю, что Dbus действительно лучший способ отправки больших объемов данных.

Как насчет записи структуры данных в файл в / tmp и простой передачи файла между программами через dbus?

4 голосов
/ 27 сентября 2012

D-шина не позволяет передавать более 128 МБ данных на сообщение, а ограничение обычно устанавливается на еще более низкое значение в /etc/dbus-1/session.conf

Именованная труба - это то, что вы ищете. Это похоже на временный файл, за исключением того, что данные не записываются на диск, а передаются от одного процесса к другому с очень низкими издержками. Не имеет ограничений по размеру данных. См. http://en.wikipedia.org/wiki/Named_pipe и Создание временного FIFO (именованного канала) в Python? для получения подробной информации.

0 голосов
/ 03 июня 2011

Одно простое решение, которое приходит мне в голову сейчас, - это разделить структуру данных. Разделить ее, отправить каждый фрагмент и соединить его вместе в другой программе.Конечно, нужно будет позаботиться о том, чтобы вы правильно к нему присоединились.

...