2

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

int[] ints = new int[1000000]

如果我直接通过ByteBuffer它的文件大小保存该值5MB

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

似乎协议缓冲区不提供原始数组类型。

有没有办法(或技巧)来减少包含数百万个整数的协议缓冲区对象的字节 [] 大小?

4

1 回答 1

1

当我将该值保存到协议缓冲区对象时

到底是怎么做的?通常,使用 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];
}
于 2019-12-05T10:38:50.107 回答