使用协议缓冲区 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];
}
我有一个包含数百万 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];
}