Protocol buffers Protobuf二进制格式的设计:性能和变量
我需要设计一种二进制格式来保存科学应用程序中的数据。这些数据必须以二进制格式编码,任何其他应用程序都无法轻松读取(这是我们的一些客户的要求)。因此,我们决定建立我们自己的二进制格式,它的编码器和解码器 我们从许多二进制格式中得到了一些启发,包括protobuf。让我困惑的一件事是protobuf编码嵌入消息长度的方式。根据,嵌入消息的大小在一开始就作为变量进行编码。 但在我们编码一条嵌入的消息之前,我们还不知道它的大小(比如一条包含许多编码为varint的整数的嵌入消息)。因此,在将消息写入磁盘之前,我们需要对其进行完全编码,以便了解其大小。 想象一下,这个信息是巨大的。因此,很难以有效的方式对其进行编码。我们可以将这个大小编码为一个完整的整数,并在写入嵌入的消息后返回到文件的这一部分,但是我们失去了varints的优良特性:您不需要指定是32位还是64位整数。因此,回到谷歌使用变体的实现:Protocol buffers Protobuf二进制格式的设计:性能和变量,protocol-buffers,Protocol Buffers,我需要设计一种二进制格式来保存科学应用程序中的数据。这些数据必须以二进制格式编码,任何其他应用程序都无法轻松读取(这是我们的一些客户的要求)。因此,我们决定建立我们自己的二进制格式,它的编码器和解码器 我们从许多二进制格式中得到了一些启发,包括protobuf。让我困惑的一件事是protobuf编码嵌入消息长度的方式。根据,嵌入消息的大小在一开始就作为变量进行编码。 但在我们编码一条嵌入的消息之前,我们还不知道它的大小(比如一条包含许多编码为varint的整数的嵌入消息)。因此,在将消息写入磁盘
是否有我缺少的实现技巧,或者此方案对于大型消息可能效率低下?是的,正确的方法是首先在缓冲区的后面写入消息,然后预先设置大小。通过适当的缓冲区管理,您可以反向写入消息
也就是说,既然可以使用protobuf,为什么还要编写自己的消息格式呢?最好直接使用Protobuf并加密文件格式。这对您来说很容易使用,但对其他应用程序来说仍然很难阅读。我不想使用protobuf有很多原因。最主要的一点是,我想要一些动态的东西,在保存的文件中有键和类型,BSON和MessagePack的工作方式。另一个原因是我将存储uint16的数组(用于16位深度的灰度图像)。protobuf没有一个总是占用2字节的uint16类型,这一点没有帮助。那么我可以问一下,为什么你发布了一个关于protobuf的问题吗?这似乎是不合适的,因为你需要一个非常不同的有线格式的东西。因为我想从不同的文件格式中窃取最好的想法。这就是我想了解它们背后的原理、优点和缺点的原因。对于科学数据和大型文件,也可以看看HDF5。如果有大量数据,它的性能通常比protobuf更好。