我有一个用C ++编写的存储管理器,我想将一些对象从Julia传递给C ++程序。这足以让我将内容作为一个字节数组接收,以后可以将其传递回Julia并轻松解码。
最小化复制数据的最佳方法是什么(并且还避免写入/读取磁盘)?
可以从C ++程序中分配所需的内存并与Julia共享以序列化对象,或者从Julia获取指向已分配内存的指针到C ++程序中。在后一种情况下,我不确定如何防止Julia方面的垃圾收集。另外,我不知道哪种序列化/反序列化方法更适合这种用例。
请您指导我在Julia和C ++之间找到这种轻量级序列化/反序列化的最佳方法吗?
编辑:如果答案取决于操作系统,请给出Linux或macOS的答案。
答案 0 :(得分:1)
很遗憾,我无法向您提供任何源代码,因为我还没有使用下面提到的C ++中的任何框架,也根本不了解Julia。
我在过去的项目中遵循的方法并不像共享指向已经由C ++分配的内存的指针一样轻量级。但是,既然目前还没有答案,我只想补充一点,就我如何在编程语言之间交换对象(在我的情况下是Java和C#)。
我没有读取和写入光盘,而是使用了一个消息队列来使两个子系统相互交换对象。
序列化,特别是涉及更复杂的对象时,可能非常耗费资源。但是,我开始喜欢使用协议缓冲区,因为它们将预定义的对象序列化为字节流。
可以在Google Protobuffers中找到协议缓冲区的C ++库示例。 Julia的协议缓冲区分别可以在ProtoBuf.jl
中找到使用协议缓冲区的缺点是您需要有一个已定义的消息格式,这意味着您需要事先知道要交换的对象是什么样的。
可以使用消息传递队列完成数据交换,而不是共享指针或写入光盘使用本地计算机的网络接口。我已经使用的消息队列已经是ZeroMQ,因为它非常轻巧且易于使用。但是,任何其他消息队列也应该用于此目的。
对于C ++,ZeroMQ的Julia接口分别为ZMQ.jl和cppzmq。 complete guide for ZeroMQ对您的帮助非常有帮助,但您不需要为了您的目的而需要整个文档。