Snappy压缩库安装和使用之二

来源:互联网 发布:攻击路由器软件 编辑:程序博客网 时间:2024/06/05 08:34

下面给出一个使用实例:

testsnappy.cpp

 

#include <iostream>#include <string>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <cstring>#include <cstdlib>#include <errno.h>#include "spfs_communication.h"#include <snappy.h>#include "file.h"using namespace std;#define BUF_SIZE 4*1024#define COM_FILE_NAME  "/home/luoxiongwei/testsnappy/snappy-1.0.5.tar"#define UNCOM_FILE_NAME "/home/luoxiongwei/testsnappy/s.snappy"int main(){  //首先压缩   /*string instr;   File::ReadFileToStringOrDie(COM_FILE_NAME,&instr);   string outstr;int w_fd=open(UNCOM_FILE_NAME,O_WRONLY|O_CREAT,S_IRWXU|S_IRWXG);close(w_fd);snappy::Compress(instr.data(),instr.size(),&outstr);    File::WriteStringToFileOrDie(outstr,UNCOM_FILE_NAME);*///解压string instr;   File::ReadFileToStringOrDie(UNCOM_FILE_NAME,&instr);   string outstr;int w_fd=open(COM_FILE_NAME,O_WRONLY|O_CREAT,S_IRWXU|S_IRWXG);close(w_fd);snappy::Uncompress(instr.data(),instr.size(),&outstr);    File::WriteStringToFileOrDie(outstr,COM_FILE_NAME);return 0;}

 

 

file.h

 

 

#include <string>#include <cstring>using std::string;namespace File{  void ReadFileToStringOrDie(const char* filename, string* data);  void ReadFileToStringOrDie(const string& filename, string* data);  void WriteStringToFileOrDie(const string& str, const char* filename);}


 

 

 

 

file.cpp

 

 

#include "file.h"#include <cstdio>#include <cstdlib>namespace File{  void ReadFileToStringOrDie(const char* filename, string* data)  {    FILE* fp = fopen(filename, "rb");    if (fp == NULL)   {      perror(filename);      exit(1);    }    data->clear();    while (!feof(fp))   {      char buf[4096];      size_t ret = fread(buf, 1, 4096, fp);      if (ret == 0 && ferror(fp))  {        perror("fread");        exit(1);      }      data->append(string(buf, ret));    }    fclose(fp);  }  void ReadFileToStringOrDie(const string& filename, string* data)  {    ReadFileToStringOrDie(filename.c_str(), data);  }  void WriteStringToFileOrDie(const string& str, const char* filename)  {    FILE* fp = fopen(filename, "wb");    if (fp == NULL) {      perror(filename);      exit(1);    }    int ret = fwrite(str.data(), str.size(), 1, fp);    if (ret != 1) {      perror("fwrite");      exit(1);    }    fclose(fp);  }}


 

 

 

 

(4)性能比较

    只测试了文本文件压缩。Snappy压缩使用的程序为上面的示例,bzip2和gzip为Linux命令。

4.1压缩性能比较:

 

4.2 解压缩性能比较:

(五)一个疑问

我上面的测试代码都是将整个文件读入内存之后进行压缩/解压缩操作。我也曾经尝试利用下面的代码去处理大文件,但是解压缩没有成功。


 

 

 

#include <iostream>#include <string>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <cstring>#include <cstdlib>#include <errno.h>#include "spfs_communication.h"#include <snappy.h>using namespace std;#define BUF_SIZE 4*1024#define COM_FILE_NAME  "/home/luoxiongwei/testsnappy/snappy-1.0.5.tar"#define UNCOM_FILE_NAME "/home/luoxiongwei/testsnappy/s.snappy"int main(){int r_fd=open(COM_FILE_NAME,O_RDONLY);int w_fd=open(UNCOM_FILE_NAME,O_WRONLY|O_CREAT,S_IRWXU|S_IRWXG);    char buf[BUF_SIZE]={'\0'};    string outstr;while(read_pack(r_fd,buf,sizeof(buf))>0){string  instr(buf);    memset(buf,'\0',sizeof(buf));snappy::Compress(instr.data(), instr.size(), &outstr);write_pack(w_fd,outstr.c_str(),outstr.size());}close(r_fd);close(w_fd);return 0;}


 

 

我的疑问是,如何使用snappy操作大文件呢?

 

 

原创粉丝点击