大資料中批次壓縮與獨立壓縮的比較 - Bozho

banq發表於2020-09-06

壓縮在處理大量資料時效果更好,玩資料壓縮可能被視為過早的最佳化。但是,在對大型資料集進行操作的系統中,這一決定可以為您節省很多儲存成本。
如果您必須壓縮100個句子,則最好批次壓縮它們,而不是一次壓縮一個句子。讓我說明一下:

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輕鬆生成多種壓縮演算法的結果:

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);
   }
}

結果如下,

演算法        批次     單獨
<p class="indent">[code]GZIP        6590    10596
LZ4_FRAMED    9214    10900
BZIP2        6663    12451
[/code]

批次壓縮明顯快於單獨壓縮!
為什麼會有明顯的不同結果?由於大多數壓縮演算法的工作方式–它們在原始資料中查詢模式並建立這些模式的對映(非常粗略的描述)。
這有什麼用?在基礎儲存支援按記錄壓縮的大資料方案中(例如資料庫或搜尋引擎),如果將多個記錄捆綁到一個儲存/索引的記錄中,則可以節省大量磁碟空間。
但是,這不是一般有用的建議。您應該檢查特定的資料儲存實現。例如,MS SQL Server支援行和頁面壓縮。Cassandra確實在SSTable級別進行壓縮,因此您如何構造行可能無關緊要。當然,如果將資料儲存在檔案中,則將其儲存在一個檔案中並進行壓縮比分別壓縮多個檔案更有效。

 

相關文章