我的目标是尽可能高效地存储数百个单独的文件,并使用Java 1.6进行读取。这些文件平均包含125,000个数字。一些文件包含几百个数字,一些超过7,000,000。在大多数情况下,数字范围从0到255,可以存储1个字节。在某些情况下,数字范围为0-1024,2个字节。
要保存数据,请使用BZip2 implementations of Apache。但是BZip2只能存储大小不超过1个字节的数字。这就是为什么我写了一个类,它以位为单位划分整数序列,并将8位组合成1位字节。然后将这些字节写入CBZip2InputStream(BZip2 OutputStream)。两种算法的组合运作良好。不幸的是,我的算法读取速度很慢。下表显示了读取125,000个数字文件所用的时间(以毫秒为单位)。
| Gzip | 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倍。 如果没有其他方法会发布我的源代码并解释,必要时进行优化。
答案 0 :(得分:0)
听起来你的编码方案非常低效。尝试使用为您进行转换的库。请参阅协议缓冲区,但任何其他协议都可以。
如果失败,我希望您使用位操作来确保代码尽可能快。像:
byte[2] out;
int x;
out[0] = x & 0xff;
out[1] = x >> 8;
x = out[0] + (out[1] << 8);
缓慢也可能是因为您经常请求非常少量的数据。在阅读之前尝试使用稍大的缓冲区。