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

Smallest way to save java int[] with protocol buffer 3?

我有一个包含数百万 int 的复杂对象

int[] ints = new int[1000000]

如果我直接通过 ByteBuffer 保存这些值,它的文件大小约为 5MB

当我将该值保存到协议缓冲区对象时, 它不是将每个值保存为 int,而是保存为 Integer。 然后当我将该字节 [] 流保存到文件时它的文件大小超过 8MB

protocol buffer好像没有提供原始数组类型

有什么方法(或技巧)可以减少包含数百万个整数的协议缓冲区对象的 byte[] 大小吗?

When I save that values to protocol buffer object

你是如何做到这一点的?通常,使用 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(使用之字形编码;避免使用 10 字节表示负数)或 sfixed32 (每个元素总是使用 4 个字节)而不是 int32,但是 "packed" 应该仍然适用。

在 proto2 中,您需要选择加入 "packed":

syntax = "proto2";
message Whatever {
    repeated int32 ints = 1 [packed=true];
}