Как поделиться массивом в Python с программой на C ++? - PullRequest
3 голосов
/ 03 июня 2010

У меня работают две программы, одна на Python и одна на C ++, и мне нужно разделить двумерный массив (только десятичных чисел) между ними. В настоящее время я изучаю сериализацию, но, к сожалению, pickle зависит от Python. Каков наилучший способ сделать это?

Спасибо

Редактировать: вполне вероятно, что массив будет иметь только 50 элементов или около того, но передача данных должна будет происходить очень часто: 60x в секунду или более.

Ответы [ 7 ]

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

Я предлагаю Google protobuf

4 голосов
/ 03 июня 2010

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

В качестве альтернативы вы можете установить сокет (или канал) соединение между обоими процессами и передавать значения путем обмена сообщениями.

4 голосов
/ 03 июня 2010

Вы можете попробовать использовать boost::python для обеспечения совместимости ваших приложений.

Некоторая информация о pickle поддержке и простой boost::python документации.

3 голосов
/ 03 июня 2010

Ваш случай очень хорошо обрабатывается PyUblas , мостом между Numpy и Boost.Ublas, использующим Boost.Python. Этот мост поддерживает передачу векторов и матриц без копирования и очень прост в использовании.

2 голосов
/ 03 июня 2010

Насколько велик этот массив? Если он не очень большой, то JSON-сериализация хорошо подойдет. библиотеки легко доступны для C ++, а Python имеет сериализацию JSON в своей стандартной библиотеке начиная с версии 2.6. См. http://www.json.org/ для получения дополнительной информации.

1 голос
/ 03 июня 2010

Сериализация - это одна проблема, а IPC - другая. У вас есть часть IPC выяснили? (трубы, сокеты, mmap и т. д.?)

В связи с сериализацией - если вас интересует производительность, а не надежность (возможность подключения большего количества модулей к этой архитектуре) и безопасность, вам следует взглянуть на модуль struct. Это позволит вам упаковать данные в структуры C, используя строки формата для определения структуры (заботится о заполнении, выравнивании и упорядочении байтов за вас!) В программе C ++ приведите указатель на буфер к соответствующему типу структуры.

Это хорошо работает с тесно связанным скриптом Python и программой C ++, которая запускается только внутри.

1 голос
/ 03 июня 2010

Я бы предложил просто использовать массивы c (через ctypes на стороне Python) и просто извлекать / проталкивать необработанные данные через сокет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...