我必须在数据库中存储数百万个条目。每个条目由一组唯一的整数标识符标识。例如,值可以由一组10个整数标识符标识,每个标识符小于1亿。
为了减小数据库的大小,我想到了使用单个32位整数值的以下编码。
Identifier 1: 0 - 100,000,000 Identifier 2: 100,000,001 - 200,000,000 . . . Identifier 10: 900,000,001 - 1,000,000,000
我正在使用Java。我可以编写一个简单的编码/解码方法。在获取/存储期间,用户代码不必知道我正在编码/解码。
我想知道的是:实现此类编码/解码的最有效(最快)和推荐方法是什么。一个简单的实现将执行大量的乘法/减法。
是否可以使用移位(或按位操作)并选择不同的分区大小(每个分段的大小仍然必须接近1亿)?
我对任何建议,想法甚至完全不同的计划持开放态度。我想利用这样一个事实,即整数标识符是有限的,以大幅减少存储大小而不会明显影响性能。
编辑:我只是想补充说我已经浏览了这个论坛上发布的一些答案。一种常见的解决方案是分割每个标识符的位。如果我为每个标识符使用2位,总共10个标识符,那么我的标识符范围会受到严重限制。
答案 0 :(得分:1)
您可以将分段大小设为27位,从而为您提供32 * 128 M的分段。而不是42 * 100 M
int value =
int high = value >>> 27;
int low = value & ((1L << 27) -1);
与使用数据库的成本相比,这种计算可能是微不足道的。
答案 1 :(得分:1)
目前还不清楚你真正想做什么,但它听起来就像你想要一个整数值,每个位代表一个特定属性,并应用bitmask。
一个32位整数可以保存32个不同的属性,64位64等。要获得更多,你需要多个整数列。
如果不是这样,我不知道“编码”是什么意思。
答案 2 :(得分:1)
听起来你想要将0 ... 100m的多个整数值打包成一个32位整数?除非您省略了可以更有效地存储这些0 ... 100m值的重要信息,否则根本无法做到这一点。
ceil(log2(100m))= 27bit,这意味着你只有5个“备用位”。