Protocol buffers protobuf与arrow的比较

Protocol buffers protobuf与arrow的比较,protocol-buffers,apache-arrow,data-exchange,Protocol Buffers,Apache Arrow,Data Exchange,两者都是语言无关和平台无关的数据交换库。我想知道它们之间有什么区别,哪种库适合哪种情况。它们适用于两种不同的问题。Protobuf旨在为数据创建通用的“在线”或“磁盘”格式 Arrow旨在为数据创建通用的“内存”格式 当然,下一个问题是,这意味着什么 在Protobuf中,如果应用程序想要处理数据,它们首先将数据反序列化为某种“内存”表示形式。必须这样做,因为Protobuf格式不容易与CPU指令兼容。例如,protobuf将无符号整数打包成变量。它们有一个字节的变量#,字段的导线类型被填充到3

两者都是语言无关和平台无关的数据交换库。我想知道它们之间有什么区别,哪种库适合哪种情况。

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

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

当然,下一个问题是,这意味着什么

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

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

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


然而,Arrow并不总是有线传输的最佳格式,因为它可能效率低下。我前面提到的这些变量有助于Protobuf减少消息大小。此外,Protobuf标记每个字段,以便在有许多可选字段时节省空间。事实上,Arrow使用Protobuf和gRPC在Arrow Flight(RPC框架)中进行元数据的有线传输。

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

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

当然,下一个问题是,这意味着什么

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

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

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

然而,Arrow并不总是有线传输的最佳格式,因为它可能效率低下。我前面提到的这些变量有助于Protobuf减少消息大小。此外,Protobuf标记每个字段,以便在有许多可选字段时节省空间。事实上,Arrow使用Protobuf和gRPC在Arrow Flight(一个RPC框架)中进行元数据的有线传输