【发布时间】:2012-04-10 15:31:57
【问题描述】:
我必须在数据库中存储数百万个条目。每个条目由一组唯一的整数标识符标识。例如,一个值可以由一组 10 个整数标识符来标识,每个标识符都小于 1 亿。
为了减小数据库的大小,我想到了以下使用单个 32 位整数值的编码。
标识符 1:0 - 100,000,000 标识符 2:100,000,001 - 200,000,000 . . . 标识符 10:900,000,001 - 1,000,000,000我正在使用 Java。我可以编写一个简单的方法来编码/解码。用户代码不必知道我在获取/存储期间正在编码/解码。
我想知道的是:实现这种编码/解码的最有效(最快)和推荐的方法是什么。一个简单的实现将执行大量的乘法/减法。
是否可以使用移位(或按位运算)并选择不同的分区大小(每个段的大小仍然要接近一亿)?
我愿意接受任何建议、想法,甚至是完全不同的方案。我想利用整数标识符必然会大幅减少存储大小而不会显着影响性能这一事实。
编辑:我只是想补充一点,我浏览了这个论坛上发布的一些答案。一个常见的解决方案是拆分每个标识符的位。如果我为每个标识符使用 2 位,总共 10 个标识符,那么我的标识符范围就会受到严重限制。
【问题讨论】:
-
你必须对你的范围使用 2 的幂才能使位移工作。
-
你能举个例子来说明这样一个编码整数的样子(以及你如何手动解码)吗?请为您的示例使用任意 ID(如
144,560,000、200,0158,945、399,888,777等) -
请注意,通过移位,每个 id 只有 3 个字节(如果您想将 10 个 id 放入 32 位)。因此每个 id 最多只能有 8 个不同的值。
-
一个例子来说明我的问题。
-
@Thomas:你是对的。我还没想好。如果它们是由 10 的幂或类似的东西描述的,我只能存储它们。我可能无法压缩那么多。我可以将它们拆分为百万分之一、百万分之一和十亿分之一(将三个整数编码为一个大整数)。
标签: java integer decode encode pack