сериализация — Каков наиболее эффективный способ совместного использования объекта Julia с C ++?

У меня есть менеджер хранения, написанный на C ++, и я хочу передать некоторые объекты из Julia в программу C ++. Мне достаточно получить содержимое в виде массива байтов, которые впоследствии можно будет передать обратно Джулии и легко декодировать.

Каков наилучший подход, который сводит к минимуму количество копируемых данных (а также избегает записи / чтения на / с диска)?

Можно выделить требуемую память из программы на C ++ и поделиться ею с Джулией для сериализации объекта или получить указатель на выделенную память от Джулии в программу на C ++. В последнем случае я не уверен, как предотвратить сборку мусора со стороны Юлии. Кроме того, я не знаю, какой метод сериализации / десериализации больше подходит для такого случая использования.

Не могли бы вы подсказать мне, как найти лучший подход для этого типа облегченной сериализации / десериализации между Julia и C ++?

изменить: если ответ зависит от ОС, пожалуйста, дайте ответ для Linux или MacOS.

6

Решение

К сожалению, я не могу предоставить вам какой-либо исходный код, так как я не использовал ни одну из платформ, упомянутых ниже в C ++, и вообще не знаю Джулию.

Подход, которому я следовал в прошлом проекте, не такой легкий, как совместное использование указателей на память, уже выделенную C ++. Однако, поскольку ответа еще не было, я просто хочу добавить свои два цента о том, как я обмениваюсь объектами между языками программирования (в моем случае Java и C #).

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

Сериализация

Сериализация, особенно когда дело касается более сложных объектов, может быть довольно ресурсоемкой. Тем не менее, я полюбил использование протокольных буферов в этом отношении, поскольку они сериализуют предопределенный объект в поток байтов.

Пример библиотеки C ++ для буферов протокола можно найти в Google Protobuffers. Соответственно, буфер протокола для Юлии можно найти в ProtoBuf.jl

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

Обмен данными

Обмен данными может быть выполнен с использованием очереди сообщений, которая вместо совместного использования указателей или записи на диск использует сетевой интерфейс локальной машины. Очередь обмена сообщениями, которую я использовал, уже была ZeroMQ, поскольку она довольно легкая и довольно простая в использовании. Любые другие очереди сообщений также должны работать для этой цели.

Интерфейс Julia для ZeroMQ ZMQ.jl а также cppzmq соответственно для C ++. полное руководство для ZeroMQ может быть действительно полезным для начала, но вам не понадобится вся документация для ваших целей.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]