Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Protocol buffers Protobuf二进制格式的设计:性能和变量_Protocol Buffers - Fatal编程技术网

Protocol buffers Protobuf二进制格式的设计:性能和变量

Protocol buffers Protobuf二进制格式的设计:性能和变量,protocol-buffers,Protocol Buffers,我需要设计一种二进制格式来保存科学应用程序中的数据。这些数据必须以二进制格式编码,任何其他应用程序都无法轻松读取(这是我们的一些客户的要求)。因此,我们决定建立我们自己的二进制格式,它的编码器和解码器 我们从许多二进制格式中得到了一些启发,包括protobuf。让我困惑的一件事是protobuf编码嵌入消息长度的方式。根据,嵌入消息的大小在一开始就作为变量进行编码。 但在我们编码一条嵌入的消息之前,我们还不知道它的大小(比如一条包含许多编码为varint的整数的嵌入消息)。因此,在将消息写入磁盘

我需要设计一种二进制格式来保存科学应用程序中的数据。这些数据必须以二进制格式编码,任何其他应用程序都无法轻松读取(这是我们的一些客户的要求)。因此,我们决定建立我们自己的二进制格式,它的编码器和解码器

我们从许多二进制格式中得到了一些启发,包括protobuf。让我困惑的一件事是protobuf编码嵌入消息长度的方式。根据,嵌入消息的大小在一开始就作为变量进行编码。 但在我们编码一条嵌入的消息之前,我们还不知道它的大小(比如一条包含许多编码为varint的整数的嵌入消息)。因此,在将消息写入磁盘之前,我们需要对其进行完全编码,以便了解其大小。 想象一下,这个信息是巨大的。因此,很难以有效的方式对其进行编码。我们可以将这个大小编码为一个完整的整数,并在写入嵌入的消息后返回到文件的这一部分,但是我们失去了varints的优良特性:您不需要指定是32位还是64位整数。因此,回到谷歌使用变体的实现:


是否有我缺少的实现技巧,或者此方案对于大型消息可能效率低下?

是的,正确的方法是首先在缓冲区的后面写入消息,然后预先设置大小。通过适当的缓冲区管理,您可以反向写入消息


也就是说,既然可以使用protobuf,为什么还要编写自己的消息格式呢?最好直接使用Protobuf并加密文件格式。这对您来说很容易使用,但对其他应用程序来说仍然很难阅读。

我不想使用protobuf有很多原因。最主要的一点是,我想要一些动态的东西,在保存的文件中有键和类型,BSON和MessagePack的工作方式。另一个原因是我将存储uint16的数组(用于16位深度的灰度图像)。protobuf没有一个总是占用2字节的uint16类型,这一点没有帮助。那么我可以问一下,为什么你发布了一个关于protobuf的问题吗?这似乎是不合适的,因为你需要一个非常不同的有线格式的东西。因为我想从不同的文件格式中窃取最好的想法。这就是我想了解它们背后的原理、优点和缺点的原因。对于科学数据和大型文件,也可以看看HDF5。如果有大量数据,它的性能通常比protobuf更好。