Protocol buffers 使用协议缓冲区3保存java int[]的最小方法?

Protocol 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[]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写入的文件大小几乎相同。