0

我必须在数据库中存储数百万个条目。每个条目由一组唯一的整数标识符标识。例如,一个值可以由一组 10 个整数标识符来标识,每个标识符都小于 1 亿。

为了减小数据库的大小,我想到了使用单个 32 位整数值进行以下编码。

标识符 1:0 - 100,000,000
标识符 2:100,000,001 - 200,000,000
.
.
.
标识符 10:900,000,001 - 1,000,000,000

我正在使用 Java。我可以编写一个简单的方法来编码/解码。用户代码不必知道我在获取/存储期间正在编码/解码。

我想知道的是:实现这种编码/解码的最有效(最快)和推荐的方法是什么。一个简单的实现将执行大量的乘法/减法。

是否可以使用移位(或按位运算)并选择不同的分区大小(每个段的大小仍然必须接近1亿)?

我愿意接受任何建议、想法,甚至是完全不同的方案。我想利用整数标识符必然会大幅减少存储大小而不会显着影响性能这一事实。

编辑:我只是想补充一点,我浏览了这个论坛上发布的一些答案。一个常见的解决方案是拆分每个标识符的位。如果我为每个标识符使用 2 位,总共 10 个标识符,那么我的标识符范围就会受到严重限制。

4

3 回答 3

1

您可以将分段大小设为 27 位,从而为您提供 32 * 128 M 段。而不是 42 * 100 M

int value = 
int high = value >>> 27;
int low = value & ((1L << 27) -1);

与使用数据库的成本相比,这种计算可能微不足道,这毫无价值。

于 2012-04-10T15:37:58.540 回答
1

目前尚不清楚您实际想要做什么,但听起来您想要一个整数值,每个位表示具有特定属性,并应用位掩码

一个 32 位整数可以保存 32 个不同的属性,64 位 64 等。要拥有更多,您需要多个整数列。

如果不是这样,我不知道您所说的“编码”是什么意思。

于 2012-04-10T15:38:52.363 回答
1

听起来您想将 0...100m 的多个整数值打包成一个 32 位整数?除非您省略了可以更有效地存储这些 0...100m 值的重要信息,否则根本没有办法做到这一点。

ceil(log2(100m)) = 27bit,这意味着您只有 5 个“备用位”。

于 2012-04-10T15:45:24.717 回答