我有一个包含数百万个 int 的复杂对象
int[] ints = new int[1000000]
如果我直接通过ByteBuffer
它的文件大小保存该值5MB
当我将该值保存到协议缓冲区对象时,它将每个值保存int
为Integer
. 然后当我将该字节 [] 流保存到文件时它的文件大小超过8MB
似乎协议缓冲区不提供原始数组类型。
有没有办法(或技巧)来减少包含数百万个整数的协议缓冲区对象的字节 [] 大小?
我有一个包含数百万个 int 的复杂对象
int[] ints = new int[1000000]
如果我直接通过ByteBuffer
它的文件大小保存该值5MB
当我将该值保存到协议缓冲区对象时,它将每个值保存int
为Integer
. 然后当我将该字节 [] 流保存到文件时它的文件大小超过8MB
似乎协议缓冲区不提供原始数组类型。
有没有办法(或技巧)来减少包含数百万个整数的协议缓冲区对象的字节 [] 大小?
当我将该值保存到协议缓冲区对象时
你到底是怎么做的?通常,使用 protobuf,您可以在 .proto 模式中定义某种类型;这里明显的竞争者是:
syntax = "proto3";
message Whatever {
repeated int32 ints = 1;
}
在 proto3 中,“packed”被认为是启用时的默认值,所以这应该使用“packed”编码,给出一个大小......好吧,稍微取决于数据,因为它使用“varint”编码,但对于 1000000 个元素它可以是 1,000004 字节到 10,000,004 字节之间的任意值(每个元素 1 到 10 个字节,字段头 1 个字节,长度 3 个字节 - 每个元素 10 个字节通常意味着:负数编码为int32
)。
如果您知道这些值通常为负数或通常很大,您可以选择使用sint32
(使用 zig-zag 编码;避免负数使用 10 字节)或sfixed32
(每个元素始终使用 4 个字节)而不是int32
,但是“打包"应该仍然适用。
在 proto2 中,您需要选择“打包”:
syntax = "proto2";
message Whatever {
repeated int32 ints = 1 [packed=true];
}