c++ - 与 C++ 共享 Julia 对象的最有效方法是什么?

标签 c++ serialization deserialization julia

我有一个用 C++ 编写的存储管理器,我想将一些对象从 Julia 传递给 C++ 程序。接收字节数组形式的内容就足够了,稍后可以将其传回 Julia 并轻松解码。

什么是最好的方法来最小化复制数据的次数(同时避免写入/读取磁盘)?

可以从 C++ 程序分配所需的内存并与 Julia 共享以序列化对象,或者从 Julia 获取指向已分配内存的指针到 C++ 程序中。在后一种情况下,我不确定如何防止从 Julia 端进行垃圾回收。另外,我不知道哪种序列化/反序列化方法更适合这种用例。

能否请您指导我找到在 Julia 和 C++ 之间进行这种轻量级序列化/反序列化的最佳方法?

编辑:如果答案取决于操作系统,请给出适用于 Linux 或 macOS 的答案。

最佳答案

遗憾的是,我无法为您提供任何源代码,因为我没有使用过下面提到的任何 C++ 框架,也根本不了解 Julia。

我在过去的项目中一直采用的方法并不像共享指向已由 C++ 分配的内存的指针那样轻量级。然而,由于还没有答案,我只想补充我的两分钱,说明我是如何在编程语言(在我的例子中是 Java 和 C#)之间交换对象的。

我使用消息队列来让两个子系统相互交换对象,而不是从磁盘读取和写入。

序列化

序列化,尤其是当涉及到更复杂的对象时,可能会非常耗费资源。但是,我开始喜欢为此使用 Protocol Buffer ,因为它们将预定义的对象序列化为字节流。

Protocol Buffer 的 C++ 库示例可以在 Google Protobuffers 中找到。 . Julia 的 Protocol Buffer 可以分别在 ProtoBuf.jl 中找到。

使用 Protocol Buffer 的缺点是您需要定义消息格式,这意味着您已经需要事先知道要交换的对象是什么样的。

交换数据

数据交换可以使用消息队列来完成,而不是共享指针或写入磁盘使用本地机器的网络接口(interface)。我一直在使用的消息队列是 ZeroMQ,因为它非常轻巧且非常易于使用。不过,任何其他消息队列也应该适用于该目的。

ZeroMQ 的 Julia 接口(interface)是 ZMQ.jlcppzmq分别针对 C++。 complete guide for ZeroMQ可以真正帮助您入门,但您不需要整个文档来实现您的目的。

关于c++ - 与 C++ 共享 Julia 对象的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366008/

相关文章:

c++将文本文件读入整数和字符串

c++ - 黑人 : processor grids that do not use all MPI cores

c++ - 子线程退出时如何通知父线程

c++ - 无法从重载运算符传递值

json - 在 GO 中反序列化一个非标准的 json

c# - 如何向 WCF 消息序列化中的字段添加 XML 前缀?

jquery - Ajax 多个数组不工作

django - 序列化程序 - Django REST Framework - 序列化程序字段可能命名不正确,并且与 `str` 实例上的任何属性或键都不匹配

android - 如何反序列化我发送到我的网络服务的数据?

arrays - 我如何使用 Serde 来(反)序列化大于 32 个元素的数组,例如 [u8; 128]?