snappy是google的一款压缩/解压库。github
环境:
ubuntu16.04
gcc version 5.4.0(系统自带)
cmake 3.5.1
snappy 1.1.8

snappy下载

下载地址选择1.1.8版本下载

cmake配置

sudo apt-get install cmake

snappy安装

首先将下载好的文件(snappy-1.1.8.tar.gz)解压,进入解压好的文件夹打开终端,输入如下命令:

mkdir build
cd build
cmake ../
make

此时在build文件夹下可以得到静态链接库libsnappy.a以及头文件snappy-stubs-public.h

编写代码

在snappy.h提供了两个函数调用:

#压缩
size_t Compress(const char* input, size_t input_length, std::string* compressed);
#解压
bool Uncompress(const char* compressed, size_t compressed_length, std::string* uncompressed);

可以看出snappy是根据字符来进行压缩的。

按行压缩文件

按行读取文件并进行压缩,并将压缩后的值写入文件中。

#smain.cpp#include <iostream>
#include "snappy.h"
#include <string.h>
#include <fstream>using namespace std;int main(int argc, char* argv[]) {ifstream ifile(argv[1]);ofstream ofile(argv[2]);string instr;string outstr;while(ifile >> instr) {//cout << instr << endl;snappy::Compress(instr.data(), instr.size(), &outstr);ofile << outstr;//cout << outstr << endl;}return 0;
}

将snappy编译后的静态链接库libsnappy.a以及头文件snappy.hsnappy-stubs-public.h放到与上面代码相同的文件目录下,然后进行编译命令:

g++ smain.cpp libsnappy.a -std=gnu++11

得到可执行文件a.out,然后执行如下命令进行压缩:

./a.out inputfile outputfile

其中inputfile是带压缩文件路径,outputfile是压缩后的文件路径。
注意:按行压缩效果很不理想

按字符读取文件并进行压缩

按字节读取文件并进行压缩,并将压缩后的值写入文件中。
由于机器原因,本次实验采用的是每一兆字节压缩一次。并统计压缩解压时间。
如下是压缩代码

#smain2.cpp
#include <iostream>
#include "snappy.h"
#include <string.h>
#include <fstream>
#include <ctime>using namespace std;
clock_t startt,endt;int main(int argc, char* argv[]) {startt=clock();  ifstream ifile(argv[1]);ofstream ofile1(argv[2]);ofstream ofile2(argv[3]);string outstr;char buf[1048576];for(;;) {ifile.read(buf, 1048576);snappy::Compress(buf, ifile.gcount(), &outstr);ofile1 << outstr;ofile2 << outstr.size() << endl;if(ifile.eof()){break;}}endt=clock();double endtime=(double)(endt-startt)/CLOCKS_PER_SEC;cout<<"Total time:"<<endtime<<endl;return 0;
}

因为我们是根据字节进行压缩,压缩后的字节也需要记录,这样解压的时候就可以根据记录来进行解压。需要主函数传入三个参数:argv[1]记录要压缩的文件路径、argv[2]记录压缩文件路径、argv[3]记录压缩后的字节大小文件路径。
编译命令:

g++ smain2.cpp libsnappy.a -std=gnu++11 -o smain2.out

运行命令:

./smain2.out inputfile1 outputfile1 outputfile2

如下是解压代码:

#smain3.cpp
#include <iostream>
#include "snappy.h"
#include <string.h>
#include <fstream>
#include <ctime>using namespace std;
clock_t startt,endt;int main(int argc, char* argv[]) {startt=clock();ifstream ifile(argv[1]);ifstream ifile1(argv[2]);ofstream ofile2(argv[3]);string outstr = "";int size;char buf[1048576];for(;;) {ifile1 >> size;ifile.read(buf, size);snappy::Uncompress(buf, size, &outstr);if(ifile.eof()){break;}ofile2 << outstr;}endt=clock();double endtime=(double)(endt-startt)/CLOCKS_PER_SEC;cout<<"Total time:"<<endtime<<endl;return 0;
}

其中主函数也是传递三个参数:argv[1]记录压缩文件路径、argv[2]记录压缩字节大小文件路径、argv[3]记录解压后的文件路径。
编译命令:

g++ smain3.cpp libsnappy.a -std=gnu++11 -o smain3.out

运行命令:

./smain3.out inputfile1 inputfile2 outputfile1

ubuntu下的snappy安装配置以及测试相关推荐

  1. Ubuntu下OpenGrok的安装配置

    转载于:http://blog.csdn.net/tyronne/article/details/34984805 OpenGrok是一个快速,便于使用的源码搜索引擎与对照引擎,它能够帮助我们快速的搜 ...

  2. ubuntu 下php的安装配置 转自http://dsec.pku.edu.cn/~lyj/Programming/configure_php.html

    安装 Apache2: sudo apt-get install apache2 安装PHP模块: sudo apt-get install php5 php5-gd php5-cli 编辑测试页:( ...

  3. ubuntu php fpm.conf,ubuntu下nginx+PHP-FPM安装配置

    安装nginx apt-get install nginx 配置nginx 位置: /etc/nginx/nginx.conf  ,其中包含了 include /etc/nginx/conf.d/*. ...

  4. 【转】Linux/ubuntu下apache+svn安装配置

    Author:gaojinbo Time:2010-8-30 优点: 可以通过apache记录svn操作相关日志 环境: ubuntu 10.04.1 lts 64bit apache2.2 1.安装 ...

  5. ubuntu下lintel的安装配置

    现在深度学习火热,而其又是基于数据驱动的一种机器学习:做计算机视觉的免不了和图片.视频打交道,频繁的从磁盘中读取图片数据是比较耗时的,而且基于视频的深度学习更是麻烦,需要先将视频裁剪成帧,在送进网络训 ...

  6. Ubuntu下terminator的安装/配置/默认启动/使用

    一 安装 sudo apt-get install terminator 在安装好后通过win+tab呼出dash搜索"termi--"应该就能够找到安装好的terminator了 ...

  7. Ubuntu下的Rabbitvcs安装配置

    ########### Rabbitvcs ###########step 1:安装依赖关系包sudo apt-get update sudo apt-get install python-nauti ...

  8. Ubuntu下域名服务器bind9 安装与配置

    Ubuntu下域名服务器bind9 安装与配置 //更新 ubuntu :sudo apt update //1.安装: //1.2安装bind9 //sudo apt-get install bin ...

  9. Ubuntu下mongodb的安装与配置

    MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便.这里介绍在Ubuntu下mongodb的安装与配置. 1.下载 mongodb可以在官网上下载,地址,选择Ubun ...

  10. ubuntu环境下redis的安装配置

    ubuntu环境下redis的安装配置 1. 简要介绍 dis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...

最新文章

  1. vue 返回滚动条顶部组件_vue中回到顶部
  2. python3 定义 跨越多行的字符串
  3. 364. Nested List Weight Sum II
  4. html 清除float,css中如何清除float
  5. TF之CNN:利用sklearn(自带手写数字图片识别数据集)使用dropout解决学习中overfitting的问题+Tensorboard显示变化曲线
  6. mysql主键long_MySQL主键设计
  7. jstack 脚本 自动日志_GitLab从安装到全自动化备份一条龙
  8. xbox360无线手柄接收器驱动_八位堂USB 无线接收器让手柄不闲置,无线畅玩各平台游戏...
  9. (map)出现最多的数
  10. java 托盘开发_基于java开发之系统托盘的应用
  11. wegwegwegwegweg
  12. 边缘设备上的实时AI人员检测:使用预先训练的SSD模型检测人员
  13. 计算机网络学习笔记(2. 什么是网络协议)
  14. Ubuntu安装MyEclise16 过程差不多
  15. 循道丨全球最大资管公司贝莱德的崛起
  16. 为什么计算机专业英语很重要,英语对计算机专业的重要性及如何提高英语水平...
  17. 《JAVA与模式》— 调停者模式
  18. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 G 旋转矩阵 【模拟】
  19. 什么是导数和切线?以及他们的关系?
  20. 关于编码问题的复制黏贴

热门文章

  1. 实例开发:ASP.NET创建网络相册
  2. Autorun 文件结构
  3. 快速乘 防爆乘 快速幂
  4. monkey 查找闪退页面的方法
  5. java+phantomjs实现动态网页抓取
  6. Python的is和==区别
  7. [转]手把手教你搭建Hive Web环境
  8. Activiti CamelTask(骆驼任务)
  9. c# combobox 绑定枚举方式
  10. 20135234mqy-——信息安全系统设计基础第七周学习总结