如何生成一个非常大的协议缓冲区文件?

时间:2014-07-18 21:42:42

标签: protocol-buffers

我是protobuf的新手,我对如何生成一个非常大的protobuf文件有疑问。 以Google教程为例:

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}   

我必须做类似的事情:我需要在一个文件中生成大量(大约2亿条)消息。如果我尝试使用

message AddressBook {
      repeated Person person = 1;
    }

如果使用AddressBook.writeTo()方法,内存显然会快速耗尽。有关如何处理此案的任何建议?感谢

1 个答案:

答案 0 :(得分:0)

这在Protobuf文档中进行了讨论:

https://developers.google.com/protocol-buffers/docs/techniques#large-data

  

大数据集

     

协议缓冲区不是为处理大型邮件而设计的。作为一般经验法则,如果您处理的是每个大于兆字节的邮件,则可能需要考虑其他策略。

     

也就是说,协议缓冲区非常适合处理大型数据集中的单个消息。通常,大型数据集实际上只是一小部分的集合,其中每个小部分可能是结构化的数据。尽管协议缓冲区无法同时处理整个集合,但使用协议缓冲区对每个部分进行编码可以极大地简化您的问题:现在您只需要处理一组字节字符串而不是一组结构。

     

协议缓冲区不包含对大型数据集的任何内置支持,因为不同的情况需要不同的解决方案。有时一个简单的记录列表会做,而有时你可能想要更像数据库的东西。每个解决方案都应该作为一个单独的库开发,以便只有那些需要它的人才需要支付费用。