2012-04-10 90 views
0

我必须在数据库中存储数百万条目。每个条目由一组唯一的整数标识符标识。例如,一个值可能由一组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亿)?

我接受任何建议,意见或甚至完全不同的计划。我想利用整数标识符有界的事实来大幅减少存储大小,而不会明显降低性能。

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

+0

你不得不使用2的幂来获得位移。 – MeBigFatGuy 2012-04-10 15:37:46

+1

你能举一个这样的编码整数如何看起来像(以及如何手动解码)的例子吗?请使用任意ID(例如'144,560,000','200,0158,945','399,888,777'等) – Thomas 2012-04-10 15:38:38

+1

请注意,如果您想将10个ID插入32位)。因此每个ID最多只能有8个不同的值。 – Thomas 2012-04-10 15:40:14

回答

1

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

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

+0

谢谢。我没有想到它通过。 – 2012-04-10 17:53:02

1

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

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

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

1

目前还不清楚你真正想做的事,但像你想的整数值,听起来,每一位代表具有特定属性,并应用bitmask

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

如果不是这样,我不知道你的意思是“编码”。

+0

你说得对。我正在考虑缩小文件大小的其他方法。 – 2012-04-10 17:53:44