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

时间:2018-01-21 10:52:16

标签: c++ serialization deserialization julia

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

最小化复制数据的最佳方法是什么(并且还避免写入/读取磁盘)?

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

序列化

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

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

中找到

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

交换数据

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

对于C ++,ZeroMQ的Julia接口分别为ZMQ.jlcppzmqcomplete guide for ZeroMQ对您的帮助非常有帮助,但您不需要为了您的目的而需要整个文档。