使用 BZip2/GZip 压缩大于 256(1 字节)的数字
Compressing numbers greater than 256 (1 byte) with BZip2/GZip
我的目标是尽可能高效地存储数百个单独的文件,并使用 Java 1.6 进行阅读。这些文件平均包含 125,000 个数字。有些文件包含几百个数字,有些超过 7,000,000。在大多数情况下,数字范围从 0 到 255,可以存储 1 个字节。在某些情况下,数字范围为 0-1024,2 个字节。
为了保存数据,我使用了 BZip2 implementations of Apache。但是 BZip2 只能存储大小不超过 1 个字节的数字。这就是为什么我写了一个 class 将整数序列按位划分并将 8 位组合为 1 字节的原因。然后将这些字节写入 CBZip2InputStream (BZip2 OutputStream)。两种算法的结合效果很好。不幸的是,我的算法读取速度很慢。下面的 table 显示读取包含 125,000 个数字的文件所花费的时间(以毫秒为单位)。
|压缩 | BZip2 | UTF-8 |我的算法 |
| 47 | 28 | 35 | 1008 |
| 37 | 12 | 13 |第856章|
| 25 | 11 | 10 | 845|
| 25 | 12 | 5 |第862章|
我的算法比 BZip2 慢 56 倍。
是否有另一种方法可以有效地压缩超过 8 位的数字。特别是,阅读速度应该是最重要的。在与 BZip2 类似的高压缩下,读取速度应该只高 2 到 4 倍。
如果没有别的办法会post我的源码和说明,必要时优化一下。
听起来你的编码方案效率很低。尝试使用为您进行转换的库。参见例如协议缓冲区,但任何其他的都可以。
否则我希望您使用位操作来确保代码尽可能快。喜欢:
byte[2] out;
int x;
out[0] = x & 0xff;
out[1] = x >> 8;
x = out[0] + (out[1] << 8);
缓慢也可能是因为您经常请求非常少量的数据。在读取之前尝试使用较大的缓冲区。
我的目标是尽可能高效地存储数百个单独的文件,并使用 Java 1.6 进行阅读。这些文件平均包含 125,000 个数字。有些文件包含几百个数字,有些超过 7,000,000。在大多数情况下,数字范围从 0 到 255,可以存储 1 个字节。在某些情况下,数字范围为 0-1024,2 个字节。
为了保存数据,我使用了 BZip2 implementations of Apache。但是 BZip2 只能存储大小不超过 1 个字节的数字。这就是为什么我写了一个 class 将整数序列按位划分并将 8 位组合为 1 字节的原因。然后将这些字节写入 CBZip2InputStream (BZip2 OutputStream)。两种算法的结合效果很好。不幸的是,我的算法读取速度很慢。下面的 table 显示读取包含 125,000 个数字的文件所花费的时间(以毫秒为单位)。
|压缩 | BZip2 | UTF-8 |我的算法 |
| 47 | 28 | 35 | 1008 |
| 37 | 12 | 13 |第856章|
| 25 | 11 | 10 | 845|
| 25 | 12 | 5 |第862章|
我的算法比 BZip2 慢 56 倍。
是否有另一种方法可以有效地压缩超过 8 位的数字。特别是,阅读速度应该是最重要的。在与 BZip2 类似的高压缩下,读取速度应该只高 2 到 4 倍。 如果没有别的办法会post我的源码和说明,必要时优化一下。
听起来你的编码方案效率很低。尝试使用为您进行转换的库。参见例如协议缓冲区,但任何其他的都可以。
否则我希望您使用位操作来确保代码尽可能快。喜欢:
byte[2] out;
int x;
out[0] = x & 0xff;
out[1] = x >> 8;
x = out[0] + (out[1] << 8);
缓慢也可能是因为您经常请求非常少量的数据。在读取之前尝试使用较大的缓冲区。