Java进阶教程:批量压缩与单个压缩

作者 : IT 大叔 本文共1366个字,预计阅读时间需要4分钟 发布时间: 2020-09-20

分享一些简短而又显而易见的内容-压缩在处理大量数据时效果更好。也就是说,如果您必须压缩100个句子,则最好批量压缩它们,而不是一次压缩一个句子。让我说明一下:

Java

public static void main(String[] args) throws Exception {

    List<String> sentences = new ArrayList<>();
    for (int i = 0; i < 100; i ++) {
        StringBuilder sentence = new StringBuilder();
        for (int j = 0; j < 100; j ++) { 
          sentence.append(RandomStringUtils.randomAlphabetic(10)).append(" "); 
        } 
        sentences.add(sentence.toString()); 
    } 
    byte[] compressed = compress(StringUtils.join(sentences, ". ")); 
    System.out.println(compressed.length); 

    System.out.println(sentences.stream().collect(Collectors.summingInt(sentence -> compress(sentence).length)));

}

compress方法使用commons-compress轻松生成多种压缩算法的结果:

Java

public static byte[] compress(String str) {
    if (str == null || str.length() == 0) {
       return new byte[0];
   }
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   try (CompressorOutputStream gzip = new CompressorStreamFactory()
           .createCompressorOutputStream(CompressorStreamFactory.GZIP, out)) {
       gzip.write(str.getBytes("UTF-8"));
       gzip.close();
       return out.toByteArray();
   } catch (Exception ex) {
       throw new RuntimeException(ex);
   }
}

结果如下,以字节为单位(请注意,由于存在一些随机性,因此算法无法直接比较):

为什么会有明显的结果?由于大多数压缩算法的工作方式-它们在原始数据中查找模式并创建这些模式的映射(非常粗略的描述)。

这有什么用?在基础存储支持按记录压缩的大数据方案中(例如数据库或搜索引擎),如果将多个记录捆绑到一个存储/索引记录中,则可以节省大量磁盘空间。

但是,这不是一般有用的建议。您应该检查特定的数据存储实现。例如,MS SQL Server支持行和页面压缩。Cassandra确实在SSTable级别进行压缩,因此您如何构造行可能无关紧要。当然,如果将数据存储在文件中,则将其存储在一个文件中并进行压缩比分别压缩多个文件更有效。

磁盘空间很便宜,因此玩数据捆绑和压缩可能被视为过早的优化。但是,在对大型数据集进行操作的系统中,这一决定可以为您节省很多存储成本。

免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Java进阶教程:批量压缩与单个压缩

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论