[转]Snappy压缩库安装和使用之一
近日需要在毕业设计中引入一个压缩库,要求压缩与解压缩速度快,但是压缩率可以不那么苛刻。查找资料发现Google的snappy库比较合适,而且该库开源,由C++写成。所以就拿来使用一下,下面权作记录。下面引出的任何涉及Google公司的源代码,版权归Google公司所有,我权作学习交流。文章安排如下,首先简要介绍Snappy,之后安装之,然后以实际例子介绍如何使用,接着bzip2和gzip做了性能比较,最后提出一些使用上面的疑问。
(一)简要介绍
去官网下载之http://code.google.com/p/snappy/。在Project Home处有这么一段英文,我想许多地方都引用和翻译了这段。我也尝试翻译一下。
Snappy is a compression/decompression library.
It does not aim for maximum compression,
or compatibility with any other compression library;
instead, it aims for veryhigh speeds and reasonable compression.
For instance, compared to the fastest mode of zlib,
Snappy is an order of magnitude faster for most inputs,
but the resulting compressed files are anywhere from 20% to 100% bigger.
On a single core of a Core i7 processor in 64-bit mode,
Snappy compresses at about 250 MB/sec or more and
decompresses at about 500 MB/sec or more.
Snappy is widely used inside Google, in everything from BigTable
and MapReduce to our internal RPC systems.
译文:Snappy是一个压缩/解压缩库。它不是以最大压缩率,或者与其他压缩库兼容为目标;它旨在获得高速的压缩和合理的压缩率。例如,Snappy对大多数的输入比zlib的最快模式要快几个数量级,但是其压缩过后的文件通常会比zlib大20%到100%。在Core i7的单核64位模式下,Snappy压缩速度大概可以达到250MB/s或者更快,解压缩可以达到大约500MB/s或更快。
Snappy在Google内部广泛使用,从BigTable,MapReduce到公司内部的RPC系统。
(二)安装过程
下面描述安装过程:
下载snappy-1.0.5.tar.gz,snappy的安装过程与传统的安装过程一样。解压后的INSTALL文件有详细的安装说明。
gunzip snappy-1.0.5.tar.gz
tar xf snappy-1.0.5.tar
cd snappy-1.0.5
./configure
make
make install
安装完成后,生成的动态库和静态库位于/usr/local/lib处,编程需要用到的头文件位于/usr/local/include处。注意需要将这些库文件cp至/usr/lib处,不然就算在链接的时候加上-L/usr/local/lib,在运行时也会报错。./main: error while loading shared libraries: libsnappy.so.1:
cannot open shared object file: No such file or directory
当然这是我的LD_LIBRARY_PATH环境变量的设置问题。
(三)使用snappy
解压出来的README文件介绍了一简单的使用方式。snappy是各种库标示符所在的命名空间。C++使用需要包含#include <snappy.h>头文件,C语言使用需要包含#include<snapyy-c.h>头文件。Snappy使用较为简单,我指的是跟bzip2的库比起来。所有的函数接口都暴露在上述两个头文件中,头文件中有详细的使用说明,并有简单的示例,而且英文通俗易懂。摘抄如下(Google公司版权所有):
snappy.h
- // Copyright 2005 and onwards Google Inc.
 - //
 - // Redistribution and use in source and binary forms, with or without
 - // modification, are permitted provided that the following conditions are
 - // met:
 - //
 - // * Redistributions of source code must retain the above copyright
 - // notice, this list of conditions and the following disclaimer.
 - // * Redistributions in binary form must reproduce the above
 - // copyright notice, this list of conditions and the following disclaimer
 - // in the documentation and/or other materials provided with the
 - // distribution.
 - // * Neither the name of Google Inc. nor the names of its
 - // contributors may be used to endorse or promote products derived from
 - // this software without specific prior written permission.
 - //
 - // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 - // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 - // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 - // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 - // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 - // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 - // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 - // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 - // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 - // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 - // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 - //
 - // A light-weight compression algorithm. It is designed for speed of
 - // compression and decompression, rather than for the utmost in space
 - // savings.
 - //
 - // For getting better compression ratios when you are compressing data
 - // with long repeated sequences or compressing data that is similar to
 - // other data, while still compressing fast, you might look at first
 - // using BMDiff and then compressing the output of BMDiff with
 - // Snappy.
 - #ifndef UTIL_SNAPPY_SNAPPY_H__
 - #define UTIL_SNAPPY_SNAPPY_H__
 - #include <stddef.h>
 - #include <string>
 - #include "snappy-stubs-public.h"
 - namespace snappy {
 - class Source;
 - class Sink;
 - // ------------------------------------------------------------------------
 - // Generic compression/decompression routines.
 - // ------------------------------------------------------------------------
 - // Compress the bytes read from "*source" and append to "*sink". Return the
 - // number of bytes written.
 - size_t Compress(Source* source, Sink* sink);
 - bool GetUncompressedLength(Source* source, uint32* result);
 - // ------------------------------------------------------------------------
 - // Higher-level string based routines (should be sufficient for most users)
 - // ------------------------------------------------------------------------
 - // Sets "*output" to the compressed version of "input[0,input_length-1]".
 - // Original contents of *output are lost.
 - //
 - // REQUIRES: "input[]" is not an alias of "*output".
 - size_t Compress(const char* input, size_t input_length, string* output);
 - // Decompresses "compressed[0,compressed_length-1]" to "*uncompressed".
 - // Original contents of "*uncompressed" are lost.
 - //
 - // REQUIRES: "compressed[]" is not an alias of "*uncompressed".
 - //
 - // returns false if the message is corrupted and could not be decompressed
 - bool Uncompress(const char* compressed, size_t compressed_length,
 - string* uncompressed);
 - // ------------------------------------------------------------------------
 - // Lower-level character array based routines. May be useful for
 - // efficiency reasons in certain circumstances.
 - // ------------------------------------------------------------------------
 - // REQUIRES: "compressed" must point to an area of memory that is at
 - // least "MaxCompressedLength(input_length)" bytes in length.
 - //
 - // Takes the data stored in "input[0..input_length]" and stores
 - // it in the array pointed to by "compressed".
 - //
 - // "*compressed_length" is set to the length of the compressed output.
 - //
 - // Example:
 - // char* output = new char[snappy::MaxCompressedLength(input_length)];
 - // size_t output_length;
 - // RawCompress(input, input_length, output, &output_length);
 - // ... Process(output, output_length) ...
 - // delete [] output;
 - void RawCompress(const char* input,
 - size_t input_length,
 - char* compressed,
 - size_t* compressed_length);
 - // Given data in "compressed[0..compressed_length-1]" generated by
 - // calling the Snappy::Compress routine, this routine
 - // stores the uncompressed data to
 - // uncompressed[0..GetUncompressedLength(compressed)-1]
 - // returns false if the message is corrupted and could not be decrypted
 - bool RawUncompress(const char* compressed, size_t compressed_length,
 - char* uncompressed);
 - // Given data from the byte source 'compressed' generated by calling
 - // the Snappy::Compress routine, this routine stores the uncompressed
 - // data to
 - // uncompressed[0..GetUncompressedLength(compressed,compressed_length)-1]
 - // returns false if the message is corrupted and could not be decrypted
 - bool RawUncompress(Source* compressed, char* uncompressed);
 - // Returns the maximal size of the compressed representation of
 - // input data that is "source_bytes" bytes in length;
 - size_t MaxCompressedLength(size_t source_bytes);
 - // REQUIRES: "compressed[]" was produced by RawCompress() or Compress()
 - // Returns true and stores the length of the uncompressed data in
 - // *result normally. Returns false on parsing error.
 - // This operation takes O(1) time.
 - bool GetUncompressedLength(const char* compressed, size_t compressed_length,
 - size_t* result);
 - // Returns true iff the contents of "compressed[]" can be uncompressed
 - // successfully. Does not return the uncompressed data. Takes
 - // time proportional to compressed_length, but is usually at least
 - // a factor of four faster than actual decompression.
 - bool IsValidCompressedBuffer(const char* compressed,
 - size_t compressed_length);
 - // *** DO NOT CHANGE THE VALUE OF kBlockSize ***
 - //
 - // New Compression code chops up the input into blocks of at most
 - // the following size. This ensures that back-references in the
 - // output never cross kBlockSize block boundaries. This can be
 - // helpful in implementing blocked decompression. However the
 - // decompression code should not rely on this guarantee since older
 - // compression code may not obey it.
 - static const int kBlockLog = 15;
 - static const size_t kBlockSize = 1 << kBlockLog;
 - static const int kMaxHashTableBits = 14;
 - static const size_t kMaxHashTableSize = 1 << kMaxHashTableBits;
 - } // end namespace snappy
 - #endif // UTIL_SNAPPY_SNAPPY_H__
 
snapp-c.h
- /*
 - * Copyright 2011 Martin Gieseking <martin.gieseking@uos.de>.
 - *
 - * Redistribution and use in source and binary forms, with or without
 - * modification, are permitted provided that the following conditions are
 - * met:
 - *
 - * * Redistributions of source code must retain the above copyright
 - * notice, this list of conditions and the following disclaimer.
 - * * Redistributions in binary form must reproduce the above
 - * copyright notice, this list of conditions and the following disclaimer
 - * in the documentation and/or other materials provided with the
 - * distribution.
 - * * Neither the name of Google Inc. nor the names of its
 - * contributors may be used to endorse or promote products derived from
 - * this software without specific prior written permission.
 - *
 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 - *
 - * Plain C interface (a wrapper around the C++ implementation).
 - */
 - #ifndef UTIL_SNAPPY_OPENSOURCE_SNAPPY_C_H_
 - #define UTIL_SNAPPY_OPENSOURCE_SNAPPY_C_H_
 - #ifdef __cplusplus
 - extern "C" {
 - #endif
 - #include <stddef.h>
 - /*
 - * Return values; see the documentation for each function to know
 - * what each can return.
 - */
 - typedef enum {
 - SNAPPY_OK = 0,
 - SNAPPY_INVALID_INPUT = 1,
 - SNAPPY_BUFFER_TOO_SMALL = 2,
 - } snappy_status;
 - /*
 - * Takes the data stored in "input[0..input_length-1]" and stores
 - * it in the array pointed to by "compressed".
 - *
 - * <compressed_length> signals the space available in "compressed".
 - * If it is not at least equal to "snappy_max_compressed_length(input_length)",
 - * SNAPPY_BUFFER_TOO_SMALL is returned. After successful compression,
 - * <compressed_length> contains the true length of the compressed output,
 - * and SNAPPY_OK is returned.
 - *
 - * Example:
 - * size_t output_length = snappy_max_compressed_length(input_length);
 - * char* output = (char*)malloc(output_length);
 - * if (snappy_compress(input, input_length, output, &output_length)
 - * == SNAPPY_OK) {
 - * ... Process(output, output_length) ...
 - * }
 - * free(output);
 - */
 - snappy_status snappy_compress(const char* input,
 - size_t input_length,
 - char* compressed,
 - size_t* compressed_length);
 - /*
 - * Given data in "compressed[0..compressed_length-1]" generated by
 - * calling the snappy_compress routine, this routine stores
 - * the uncompressed data to
 - * uncompressed[0..uncompressed_length-1].
 - * Returns failure (a value not equal to SNAPPY_OK) if the message
 - * is corrupted and could not be decrypted.
 - *
 - * <uncompressed_length> signals the space available in "uncompressed".
 - * If it is not at least equal to the value returned by
 - * snappy_uncompressed_length for this stream, SNAPPY_BUFFER_TOO_SMALL
 - * is returned. After successful decompression, <uncompressed_length>
 - * contains the true length of the decompressed output.
 - *
 - * Example:
 - * size_t output_length;
 - * if (snappy_uncompressed_length(input, input_length, &output_length)
 - * != SNAPPY_OK) {
 - * ... fail ...
 - * }
 - * char* output = (char*)malloc(output_length);
 - * if (snappy_uncompress(input, input_length, output, &output_length)
 - * == SNAPPY_OK) {
 - * ... Process(output, output_length) ...
 - * }
 - * free(output);
 - */
 - snappy_status snappy_uncompress(const char* compressed,
 - size_t compressed_length,
 - char* uncompressed,
 - size_t* uncompressed_length);
 - /*
 - * Returns the maximal size of the compressed representation of
 - * input data that is "source_length" bytes in length.
 - */
 - size_t snappy_max_compressed_length(size_t source_length);
 - /*
 - * REQUIRES: "compressed[]" was produced by snappy_compress()
 - * Returns SNAPPY_OK and stores the length of the uncompressed data in
 - * *result normally. Returns SNAPPY_INVALID_INPUT on parsing error.
 - * This operation takes O(1) time.
 - */
 - snappy_status snappy_uncompressed_length(const char* compressed,
 - size_t compressed_length,
 - size_t* result);
 - /*
 - * Check if the contents of "compressed[]" can be uncompressed successfully.
 - * Does not return the uncompressed data; if so, returns SNAPPY_OK,
 - * or if not, returns SNAPPY_INVALID_INPUT.
 - * Takes time proportional to compressed_length, but is usually at least a
 - * factor of four faster than actual decompression.
 - */
 - snappy_status snappy_validate_compressed_buffer(const char* compressed,
 - size_t compressed_length);
 - #ifdef __cplusplus
 - } // extern "C"
 - #endif
 - #endif /* UTIL_SNAPPY_OPENSOURCE_SNAPPY_C_H_ */
 
[转]Snappy压缩库安装和使用之一的更多相关文章
- 【神经网络与深度学习】Google Snappy - 一个高速压缩库
		
Snappy已经被Google开源,作为一个压缩库,它可以利用单颗Intel Corei7处理器内核处理至少每秒250MB~500MB的数据流. Snappy的前身是Zippy.虽然只是一个数据压缩库 ...
 - HBase 安装snappy压缩软件以及相关编码配置
		
HBase 安装snappy压缩软件以及相关编码配置 前言  在使用HBase过程中因为数据存储冗余.备份数等相关问题占用过多的磁盘空间,以及在入库过程中为了增加吞吐量所以会采用相关的压缩算法来压缩 ...
 - SEAL库 - 安装和介绍
		
本篇文章介绍:SEAL同态库的安装和简单使用 注:使用Clang++编译的Microsoft Seal比使用GNUG++编译的Microsoft Seal具有更好的运行时性能. 1. cmake:适应 ...
 - protocol buffer c++ python库安装
		
c++库安装较简单,不要用源码,还得下载依赖,就被墙了 https://github.com/google/protobuf/releases 下载一个最新的release安装 #protoc -- ...
 - phpize 扩展GD库 安装 ! 环境--centos 7  +nginx 1.7.11+php 5.6.7
		
使用phpize编译GD库安装,先安装前置库libjpeg libpng zlib freetype等 都是下面php编译的几个选项 先看php编译的选项: --with-gd=DIR ...
 - DCMTK3.6.1(MD支持库)安装说明
		
转载:http://qimo601.iteye.com/blog/1685135 [前言] 最近,因为需要开发DICOM网管模块,必须使用DCMTK的DcmNet模块.但是DCMTK3.6.0在Dcm ...
 - Snappy压缩
		
Snappy压缩时,碰到不能解压问题,所用服务器Tomcat8.经验证,降低Tomcat版本为7,才可正常解压文件. 若碰到偶尔不能解压的问题,试着换个浏览器试试.
 - laravel项目拉取下来安装,node.js库安装
		
1.拉取项目 2.切换分支 圈圈里面是版本 composer 安装laravel组件其他库 安装node.js安装包 npm set registry=https://registry.npm.ta ...
 - python 库安装笔记
		
python 库安装笔记 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-2-22 友情提示 安装python库的过程中 ...
 
随机推荐
- 手持机(Android)开发应用总结
			
对于首次接触android的我,刚接到android开发的命令时,自己完全不懂任何android技术,可是由于项目的开发时间周期很短,必须强迫自己即学即用,到了最后才发现,技术其实只是工具,重要的是一 ...
 - Ansible playbook API 开发 调用测试
			
Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible ...
 - hql between and 查询
			
public IList<PrdtStdEntity> QueryPrdtStd(PrdtStdEntity prdtStdEntity) { try { var hql = " ...
 - 关于已配置log4j,运行tomcat时显示警告的分析
			
有时候,我们在JavaEE项目中配置了log4j及其参数信息,但是启动tomcat时,仍会显示如下信息:
 - js面向对象笔记
			
JavaScript 私有成员实现 到此为止,如果您任然对 JavaScript 面向对象持怀疑态度,那么这个怀疑一定是,JavaScript 没有实现面向对象中的信息隐藏,即私有和公有.与其他类式面 ...
 - 迷你MVVM框架 avalonjs1.5 入门教程
			
avalon经过几年以后,已成为国内一个举足轻重的框架.它提供了多种不同的版本,满足不同人群的需要.比如avalon.js支持IE6等老旧浏览器,让许多靠政府项目或对兼容性要求够高的公司也能享受MVV ...
 - tomcat配置性能调优1----server.xml文件详解
			
<?xml version='1.0' encoding='utf-8'?><!-- Licensed to the Apache Software Foundation (ASF ...
 - U-Mail反垃圾邮件网关过滤Locky勒索邮件
			
近期,不少朋友圈有朋友发布相关的邮件提醒,说有关于Locky病毒勒索邮件的.看来这个病毒影响不小啊!下面就说说怎么来防止Locky勒索病毒的侵扰. 什么是Locky勒索病毒 Locky勒索病毒主要以邮 ...
 - android ListView子布局中按钮响应点击事件
			
只需要在子布局的根布局中添加以下属性即可: android:descendantFocusability="blocksDescendants"
 - angularjs(二)模板终常用的指令的使用方法
			
通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板 ...