与C++共享 Julia 对象的最有效方法是什么?
What is the most efficient way of sharing a Julia object with C++?
我有一个用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 的完整指南对于帮助您入门非常有帮助,但您不需要完整的文档来实现您的目的。
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法