首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >protobuf和arrow的比较

protobuf和arrow的比较
EN

Stack Overflow用户
提问于 2021-03-08 04:40:48
回答 1查看 641关注 0票数 2

两者都是语言中立和平台中立的数据交换库。我想知道它们有什么不同,哪个库适合哪种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-09 07:26:05

它们针对的是两个不同的问题。Protobuf旨在为数据创建一种通用的“在线”或“磁盘”格式。

Arrow旨在为数据创建一种通用的“在内存中”格式。

当然,下一个问题是,这是什么意思?

在Protobuf中,如果应用程序想要处理数据,它们首先将数据反序列化为某种“内存”表示形式。必须这样做,因为Protobuf格式不容易与CPU指令兼容。例如,protobuf将无符号整数打包成varint。它们具有可变的字节数,并且字段的线路类型被塞进3个最低有效位中。你不能把两个无符号整数相加,而不先把它们转换成某种“在内存中”的表示。

现在,protoc确实有针对每种语言的库,可以将这些语言转换为“内存中”的表示形式。然而,这种“在内存中”的表示并不常见。您不能接受Protobuf消息,将其反序列化为C# (使用protoc生成的代码),然后在Java语言中处理这些内存中的字节,而不对数据进行某种C#->Java编组。

另一方面,Arrow解决了这个问题。如果您在C#中有一个箭头表,那么您可以将该内存映射到另一种语言,并开始对其进行处理,而无需执行任何类型的“语言到语言”的数据编组。这种零拷贝允许在语言之间进行有效的切换。Python采用这样的技巧(例如数组协议)已经有一段时间了,它非常适合数据分析。

然而,Arrow并不总是最好的有线传输格式,因为它的效率可能很低。我之前提到的那些变量可以帮助Protobuf减少消息大小。此外,Protobuf标记了每个字段,因此当有许多可选字段时,它可以节省空间。事实上,Arrow使用Protobuf & gRPC在Arrow Flight (一个远程过程调用框架)中进行元数据的有线传输。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66521194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档