我是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()方法,内存显然会快速耗尽。有关如何处理此案的任何建议?感谢
答案 0 :(得分:0)
这在Protobuf文档中进行了讨论:
https://developers.google.com/protocol-buffers/docs/techniques#large-data
大数据集
协议缓冲区不是为处理大型邮件而设计的。作为一般经验法则,如果您处理的是每个大于兆字节的邮件,则可能需要考虑其他策略。
也就是说,协议缓冲区非常适合处理大型数据集中的单个消息。通常,大型数据集实际上只是一小部分的集合,其中每个小部分可能是结构化的数据。尽管协议缓冲区无法同时处理整个集合,但使用协议缓冲区对每个部分进行编码可以极大地简化您的问题:现在您只需要处理一组字节字符串而不是一组结构。
协议缓冲区不包含对大型数据集的任何内置支持,因为不同的情况需要不同的解决方案。有时一个简单的记录列表会做,而有时你可能想要更像数据库的东西。每个解决方案都应该作为一个单独的库开发,以便只有那些需要它的人才需要支付费用。