如何解析超长的protobuf(大于512MB)?
如何解析超长的protobuf(大于512MB)? 如果客户端是java代码的话,可以在protobuf文件中加上这句 option java_multiple_files = true; 不管是不是protobuf ,512M的长度肯定是系统设计问题,按照正常的正确的架构设计,是绝对不允许出现这么长的串的 一般来说先问你要解决什么问题?设计实现方案为什么要序列化超过 512 MiB 的数据?如果单纯回答如何解析,那就直接解析超大的对象咯,缺什么补什么。缺内存补内存,计算速度不够升级 CPU 呗。 不要用protobuf或者JSON解析这种数据比较好,以我的经验来说,就算能成功,也会创造出非常多的碎片对象,占用大量的内存。
如果是一个或者少量二进制数据(每个都比较大)夹杂元数据构成的数据结构,可以考虑将二进制数据拼起来放在一起,将每段数据的开始位置和长度信息以及其他元数据构造一个protobuf放在开头,这样在各种意义上都比较好。
如果是一个巨大的对象数据那样的,那可能也没有太好的办法,可以考虑下是不是可以流式传输流式处理,系统压力会低一些。 protobuf 官方指南里有关于large data sets的指南:
Protocol Buffers are not designed to handle large messages. As a general rule of thumb, if you are dealing in messages larger than a megabyte each, it may be time to consider an alternate strategy.https://developers.google.com/protocol-buffers/docs/techniques#large-data
不过这并不意味着不可以用protobuf序列化和反序列化大数据集。
由于protobuf不支持random access文件,所以大protobuf带来的比较大的问题是需要把整个protobuf文件先读到内存里。如果在内存资源丰富的情况下这并不是问题(如果有读取时间要求可以缓存读取结果)。
如果是在移动设备这种内存资源紧张的应用场景下,可以考虑不要把整个数据结构序列化成一个protobuf而是把每个子结构序列化成一个protobuf文件。
页:
[1]