Почему у меня плохое сжатие с zlib?

По умолчанию я вывожу файл размером 120 МБ. Здесь у меня есть буфер ввода и вывода, который вдвое больше. Когда я запускаю этот код, я получаю результат 10 МБ (по умолчанию 11 МБ). Когда я архивирую необработанный файл размером 128 МБ, я получаю 700 КБ. Почему я получаю 11 МБ вместо ‹1 МБ, как у zip? Используя менеджер 7-zip, я попросил его сжать с помощью gzip с помощью deflate, и он дал мне файл размером 4,6 МБ, который все еще намного меньше. Мне очень интересно, почему это происходит. Такое ощущение, что я делаю что-то не так.

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

person Community    schedule 03.06.2011    source источник


Ответы (2)


Zip может использовать Deflate64 или другой алгоритм сжатия (например, BZip2), и когда ваш файл очень разреженный, это может привести к такой разнице. Кроме того, стандарт для ZLib говорит только о формате сжатых данных, а то, как данные сжимаются, выбирается архиваторами, поэтому 7-zip может использовать некоторые эвристики, которые уменьшают вывод.

person Nickolay Olshevsky    schedule 08.06.2011

Наверное, размером с кусок? zlib.net/zpipe.c дает довольно хороший пример.

Вы, вероятно, также получите лучшую производительность, если будете разбивать поток, а не пытаться выполнить весь поток.

person synthesizerpatel    schedule 03.06.2011
comment
ммм что? ты вообще смотрел мой код? размер моего фрагмента, также известный как размер буфера, намного больше. - person ; 04.06.2011