Protocol buffers 使用协议缓冲区3保存java int[]的最小方法?
我有一个复杂的对象,它包含了数百万个intProtocol buffers 使用协议缓冲区3保存java int[]的最小方法?,protocol-buffers,protobuf-java,Protocol Buffers,Protobuf Java,我有一个复杂的对象,它包含了数百万个int int[]int=new int[1000000] 如果我直接通过ByteBuffer保存该值,其文件大小约为5MB 当我将该值保存到协议缓冲区对象时, 它不会将每个值保存为int,而是保存为Integer。 然后,当我将字节[]流保存到文件时,它的文件大小超过了8MB 协议缓冲区似乎不提供基元数组类型 是否有任何方法(或技巧)可以减少包含百万整数的协议缓冲区对象的字节[]大小 当我将该值保存到协议缓冲区对象时 你到底在做什么?通常,使用protobu
int[]int=new int[1000000]
如果我直接通过ByteBuffer
保存该值,其文件大小约为5MB
当我将该值保存到协议缓冲区对象时,
它不会将每个值保存为int
,而是保存为Integer
。
然后,当我将字节[]流保存到文件时,它的文件大小超过了8MB
协议缓冲区似乎不提供基元数组类型
是否有任何方法(或技巧)可以减少包含百万整数的协议缓冲区对象的字节[]大小
当我将该值保存到协议缓冲区对象时
你到底在做什么?通常,使用protobuf,您可以在.proto模式中定义某种类型;这里最明显的竞争者是:
syntax=“proto3”;
不管什么消息{
重复int32 ints=1;
}
在proto3中,当启用时,“压缩”被视为默认值,因此这应该使用“压缩”编码,给出的大小是。。。嗯,稍微依赖于数据,因为它使用“varint”编码,但对于1000000个元素,它可以是1000004字节到10000004字节之间的任何位置(每个元素1到10字节,字段头1字节,长度3字节-每个元素10字节通常意味着:编码为int32
)的负数)
如果您知道这些值通常为负数或较大,则可以选择使用sint32
(使用之字形编码;避免使用10个字节表示负数)或sfixed32
(每个元素始终使用4个字节)而不是int32
,但“压缩”仍应适用
在proto2中,您需要选择“打包”:
syntax=“proto2”;
不管什么消息{
重复的int32 ints=1[packed=true];
}
首先,原型示例是准确的。int[]中的数据实际上是数百万int的p压缩的结果。因此,它的每个值似乎都相当大,包括正数和负数。我会试试sint32,sfixed32。我会回来的。@Jihun您也可以尝试显式地为我的案例添加“打包”提示,重复sfixed32
生成最小的文件。与IntBuffer写入的文件大小几乎相同。