【问题标题】:Why am i getting not great compression with zlib?为什么我使用 zlib 的压缩效果不佳?
【发布时间】:2011-06-03 20:17:04
【问题描述】:

默认情况下,我输出一个 120mb 的文件。在这里,我有一个两倍的输入和输出缓冲区。当我运行此代码时,我得到 10mb 的输出(默认给我 11mb)。当我压缩原始的 128mb 文件时,我得到 700kb。为什么我得到 11mb 而不是 zip 给我的

static UInt32 len=0;
static char buf[1024*1024*256];
static char buf2[1024*1024*256];
static char *curbuf=buf;
z_stream strm;
void initzstuff()
{
    strm.zalloc = 0;
    strm.zfree = 0;
    strm.opaque = 0;
    int ret = deflateInit(&strm, Z_BEST_COMPRESSION);
    if (ret != Z_OK)
        return;
}

void flush_file(MyOstream o, bool end){
    strm.avail_in = len;
    strm.next_in = (UInt8*)buf;
    strm.avail_out = sizeof(buf2);
    strm.next_out = (UInt8*)buf2;
    int ret = deflate(&strm, (end ? Z_FINISH : Z_NO_FLUSH));
    assert(ret != Z_STREAM_ERROR);
    int have = sizeof(buf2) - strm.avail_out;
    fwrite(buf2, 1, have, o);
    if(end)
    {
        (void)deflateEnd(&strm);
    }
    len=0;
    curbuf=buf;
/*
    fwrite(buf, 1, len, o);
    len=0;
    curbuf=buf;
//*/
}

【问题讨论】:

    标签: c++ compression zip zlib


    【解决方案1】:

    Zip 可以使用 Deflate64 或其他压缩算法(如 BZip2),当您的文件非常稀疏时,可能会导致这种差异。 此外,ZLib 的标准仅说明压缩数据的格式,以及如何压缩数据由存档者选择,因此 7-zip 可以使用一些启发式方法,从而使输出更小。

    【讨论】:

      【解决方案2】:

      可能是块大小? zlib.net/zpipe.c 给出了一个很好的例子。

      如果你分块而不是尝试做整个流,你可能也会获得更好的性能。

      【讨论】:

      • 嗯什么?你甚至看过我的代码吗?我的块大小也就是缓冲区大小要大得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多