使用zlib输出gzip格式的文件

zlib是一个比较通用的压缩库,通过在程序中引入zlib,可以方便的对数据进行压缩。今天花了点时间研究了一下,在tbuldr中实现了直接将数据库中的数据导出为gzip文件的功能。

下载zlib源代码,对于Linux,可以编译成静态库,然后将zlib.h,libz.a(如有必要,再加上zonf.h)和程序代码放置到同一个目录,编译的时候包含libz.a即可。

#./configure
#make
#make install

如果要编译成动态库,则只需要第一步改成./configure -s即可。

废话少说,下面是一段演示代码,非常简单:

#include <stdio.h>
#include "zlib.h"

int main()
{
  char *data = "this is a gzip test from NinGoo.net";
  gzFile *fp=NULL;
  fp=gzopen("test_out.gz","wb");
  gzwrite(fp,data,strlen(data));
  gzclose(fp);
}

编译:

gcc -o test test.c libz.a

执行:

$./test
$gzip -d test_out.gz
$more test_out 
this is a gzip test from NinGoo.net

tbuldr中,只需要在file参数指定的文件名后面加上.gz,就会自动输出为gzip格式的文件。至此,tbuldr已基本实现了sqluldr2的全部功能,性能测试结果也不相上下了。

另外,zlib也可以在内存中对数据进行压缩和解压缩,参考:
http://hispider.googlecode.com/svn/trunk/devel/hispider/src/utils/zstream.c



无觅相关文章插件,快速提升流量

8条评论

  • At 2009.04.29 19:33, l1t said:

    用7z吧,支持多个文件,文件尺寸能超过4G

    • At 2009.05.04 17:11, anysql said:

      zlib也支持大于4gb的内容.

      • At 2009.05.04 20:38, l1t said:

        I want
        unldr user=/ tables=t1,t2,t3

        =>并行导出t1.txt t2.txt t3.txt
        最后变成一个zip/7z
        gzip 必须先tar

        • At 2009.05.05 08:43, NinGoo said:

          嗯,这个目前只能单个unload,然后手工来tar。后续可以考虑这个需求。

        • At 2010.02.03 21:51, joey said:

          希望可以见到最新版本的代码,好好学习学。

        • At 2010.10.06 17:35, goodgoodstudy said:

          我测试了下,为啥用1M buffer写文件比直接Fwrite慢呢,定长输出几乎慢一倍哦,请老大指教,谢谢。
          另外,希望能继续开发这个工具,虽然sqluldr2可以免费使用,当高级功能都有限制了,我想大家使用工具都有个习惯吧,不是开源的再好也不用。

          • At 2012.07.30 15:13, guping said:

            gzFile *fp=NULL; 这句代码不对,gzFile本身就是指针,所以不需要*


            (Required)
            (Required, will not be published)