两者都是语言中立和平台中立的数据交换库。我想知道它们有什么不同,哪个库适合哪种情况。
发布于 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 (一个远程过程调用框架)中进行元数据的有线传输。
https://stackoverflow.com/questions/66521194
复制相似问题