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

What is the most efficient way of sharing a Julia object with C++?

本文关键字:有效 方法 是什么 C++ 共享 Julia 对象      更新时间:2023-10-16

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

最大限度地减少复制数据的数量(并且还避免向磁盘写入/从磁盘读取)的最佳方法是什么?

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

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

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

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

我在过去的项目中一直遵循的方法并不像共享指向C++已经分配的内存的指针那样轻量级。但是,由于还没有答案,我只想补充一下如何在编程语言(在我的情况下是Java和C#)之间交换对象。

我没有读取和写入光盘,而是使用消息队列使两个子系统相互交换对象。

序列化

序列化(尤其是涉及更复杂的对象时)可能会非常耗费资源。但是,我开始喜欢使用协议缓冲区,因为它们将预定义的对象序列化为字节流。

协议缓冲区的C++库示例可以在 Google Protobuffers 中找到。分别,Julia的协议缓冲区可以在ProtoBuf.jl中找到。

使用协议缓冲区的缺点是您需要有一个定义的消息格式,这意味着您已经需要事先知道要交换的对象是什么样子的。

交换数据

数据交换可以使用消息传递队列来完成,该队列不是共享指针或写入光盘,而是使用本地计算机的网络接口。我一直在使用的消息传递队列是 ZeroMQ,因为它非常轻巧且相当易于使用。不过,任何其他消息传递队列也应该为此目的工作。

ZeroMQ 的 Julia 接口分别是 ZMQ.jl 和 cppzmq 用于C++。ZeroMQ 的完整指南对于帮助您入门非常有帮助,但您不需要完整的文档来实现您的目的。