【发布时间】:2019-09-24 01:02:40
【问题描述】:
我尝试压缩一个大(100mb 到 500mb)的 xml 文件。我已经创建了方法 Zip 来做到这一点。问题是它谈论太多时间来压缩。对于 200mb 需要 1.2 秒。我需要将 100mb xml 文件的时间减少 100 毫秒。 如何优化以减少压缩时间?
我通过在压缩比上做出少许妥协来缩短时间。 尝试了另一种算法,如 Snappy、Lz4,但没有太大改进,而且它们的压缩率也很差。据我所知,gzipOutputStream.write() 需要 85% 的时间。所以我怎样才能优化这一步以获得更好的性能而不会影响很多压缩比。
public static String zip(final String str) {
if ((str == null) || (str.length() == 0)) {
throw new IllegalArgumentException("Cannot zip null or empty string");
}
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(str.length())) {
try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream){{def.setLevel(Deflater.BEST_SPEED );}};) {
gzipOutputStream.write(str.getBytes(StandardCharsets.UTF_8));
}
T5 = System.currentTimeMillis();
byte[] bytes=byteArrayOutputStream.toByteArray();
T3 = System.currentTimeMillis();
String zipped_text=DatatypeConverter.printBase64Binary(bytes);
T4 = System.currentTimeMillis();
return zipped_text;
} catch(IOException e) {
throw new RuntimeException("Failed to zip content", e);
}
}
【问题讨论】:
-
移除压缩,混乱时间——这可能是你的时间渐近线。
-
您实质上是在问如何编写一段代码,而这段代码绝不会为速度提高 12 倍而优化。答案是:使用针对速度优化的压缩算法。然后你的硬件可能仍然是一个瓶颈。
-
在每一步中,您总是在处理整个块。 100MB 太大,无法容纳任何 CPU 缓存。因此以约 500KB 的块处理数据并使用流直接重定向输出,例如使用来自 apache commons 编解码器的 Base64OutputStream。
-
@Robert 我是 java 新手,你能提供优化的代码或这个例子吗?谢谢你的时间
-
不要在内存中做这一切。将其写入目标文件、套接字或其他任何内容。
标签: java gzip gzipoutputstream