snappy壓縮/解壓庫


snappy

snappy是由google開發的壓縮/解壓C++庫,注重壓縮速度,壓縮后文件大小比其它算法大一些
snappy在64位x86並且是小端的cpu上性能最佳

  • 在Intel(R) Core(TM)2 2.4GHz中測試數據:
    壓縮速率:~200-500MB/s
    解壓速率:~400-800MB/s
  • 壓縮比(壓縮數據大小/原始數據大小):
    對於HTML:~25%
    對於普通文本(plain text):~50%
    對於JPEG等已經壓縮過的文件:~100%

壓縮/解壓demo

/**
 * 壓縮數據
 * @param bs 輸入的字節數組
 * @return 經過壓縮的數據
 */
Bytes SnappyCompress::compress(BytesConstRef bs) {
    // 提前分配足夠的空間
    Bytes ret(snappy::MaxCompressedLength(bs.size()));
    size_t compressedLen = 0;

    // 進行壓縮
    snappy::RawCompress(
        reinterpret_cast<const char*>(bs.data()),
        bs.size(),
        reinterpret_cast<char*>(ret.data()),
        &compressedLen
    );

    // 調整為實際的壓縮長度
    ret.resize(compressedLen);

    return ret;
}

/**
 * 解壓數據
 * @param bs 經過壓縮的字節數組
 * @return 經過解壓的數據
 * @throw 輸入的壓縮數據損壞拋出CorruptedInput異常
 */
Bytes SnappyCompress::uncompress(BytesConstRef bs) {
    // 解析出解壓數據的長度(花費O(1)時間)
    size_t uncompressedLen = 0;
    bool status = snappy::GetUncompressedLength(
        reinterpret_cast<const char*>(bs.data()),
        bs.size(),
        &uncompressedLen
    );

    if (!status) {
        // 解析長度編碼出錯
        throw CorruptedInput();
    }

    // 提前分配空間
    Bytes ret(uncompressedLen);

    // 進行解壓
    status = snappy::RawUncompress(
        reinterpret_cast<const char*>(bs.data()),
        bs.size(),
        reinterpret_cast<char*>(ret.data())
    );

    if (!status) {
        // 壓縮數據損壞
        throw CorruptedInput();
    }

    return ret;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM