我的SQLite db文件大小为85MB,使用XZ格式压缩,其大小已减少到16MB。我使用以下代码(以及XZ for Java提供的JAR)在Android Jelly Bean中解压缩它:
try {
FileInputStream fin = new FileInputStream(path + "myFile.xz");
BufferedInputStream in = new BufferedInputStream(fin);
FileOutputStream out = new FileOutputStream(des + "myDecompressed");
XZInputStream xzIn = new XZInputStream(in);
final byte[] buffer = new byte[8192];
int n = 0;
while (-1 != (n = xzIn.read(buffer))) {
out.write(buffer, 0, n);
}
out.close();
xzIn.close();
}
catch(Exception e) {
Log.e("Decompress", "unzip", e);
}
解压缩成功完成,但需要两分多钟才能完成。我认为这很长,因为压缩文件只有16MB而未压缩文件只有85MB。
我想知道我是否对代码做错了,或者有办法加速这个解压缩过程。
答案 0 :(得分:2)
我认为你无法做到更快。如果将16Mb解压缩到85Mb需要2分钟,那么大部分时间都花在实际解压缩中,其余的很大一部分都在实际文件I / O中...物理层。
当然,你的代码没有任何明显的低效率。您正在使用BufferedInputStream进行读取并使用大缓冲区进行解码/写入。因此,您将有效地进行I / O系统调用。 (添加BufferedOutputStream
不会有任何区别,因为您已经从8192字节缓冲区进行大写操作。)
我建议的最好的方法是,您可以对代码进行分析,以了解热点的真实位置。但我怀疑你找不到任何可以改进的东西来发挥作用。
我想去XZ,因为它在我的情况下具有最好的压缩级别,这有点节省下载时间...(使用zip,解压缩此文件只需要大约15秒!
嗯,解压缩的额外CPU时间是使用压缩算法达到最大值所支付的价格。您需要确定哪个对您的用户更重要:更快的下载速度,或更快的数据库解压缩(安装?)。
FWIW,ZIP解压缩可能在本机库中实现,而不是在纯Java中实现。它肯定适用于Oracle / OpenJDK JVM。
答案 1 :(得分:1)
你应该做的最少的事情是将FileOutputStream
包裹在BufferedOutputStream
中,很少有你不应该使用BufferedInputStream
/ BufferedOutputStream
的情况。试一试,看看现在需要多长时间。