Передача большой структуры данных через 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)

person Sergio    schedule 02.06.2011    source источник


Ответы (3)


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

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

person Ali Lown    schedule 02.06.2011
comment
+1 DBUS предназначен для передачи небольших сообщений, а не для потоковой передачи больших объемов данных. Временные файлы или какая-то общая память, вероятно, лучший вариант. - person detly; 03.06.2011
comment
+1. DBus должен отправлять дескриптор большого фрагмента данных (временного файла, общей области памяти), а не самих данных. - person 9000; 03.06.2011
comment
Чтобы прояснить и подчеркнуть то, что говорит 9000, D-Bus предоставляет средство для передачи файловых дескрипторов в сообщениях D-Bus, что лучше, чем передача имени файла, поскольку вы можете, например, передать файловый дескриптор, доступный только для чтения, или передать дескриптор к безымянной трубе. Тип файловых дескрипторов - h. - person Philip Withnall; 06.07.2017

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

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

person Shnatsel    schedule 27.09.2012
comment
Чтобы прояснить это: D-Bus явно задуман как система обмена сообщениями для небольших управляющих сообщений с малой задержкой (называемых в сетевой терминологии «плоскостью управления»). Он не предназначен для передачи больших сообщений с высокой пропускной способностью («плоскость данных»). Он явно предоставляет способ передачи файловых дескрипторов (типа D-Bus h) между одноранговыми узлами, поэтому обмен сообщениями D-Bus можно использовать для настройки межпроцессных каналов для передачи данных с высокой пропускной способностью. - person Philip Withnall; 06.07.2017

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

person Mauricio    schedule 02.06.2011
comment
Это плохая идея, поскольку таким образом вы в конечном итоге отправляете по шине больше данных (тот же объем данных, что и в противном случае, плюс дополнительные заголовки сообщений). - person Philip Withnall; 06.07.2017