为什么我用zlib没有得到很好的压缩

Why am i getting not great compression with zlib?

本文关键字:很好 压缩 zlib 为什么      更新时间:2023-10-16

默认情况下,我输出一个120mb的文件。这里我有一个输入和输出缓冲区,是它的两倍。当我运行这个代码时,我得到了10mb的输出(默认值为11mb)。当我压缩原始128mb文件时,我得到700kb。为什么我得到的是11mb而不是<1mb像拉链给我的?使用7-zip管理器,我让它使用deflate用gzip压缩,它给了我一个4.6mb的文件,这个文件仍然小得多。我很好奇为什么会发生这种事。感觉我好像做错了什么。

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;
//*/
}

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

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

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