为什么我用zlib没有得到很好的压缩
Why am i getting not great compression with zlib?
默认情况下,我输出一个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给出了一个相当好的例子。
如果你对整个流进行分块而不是尝试进行分块,你可能也会得到更好的性能。
相关文章:
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 很好的语法来获取对向量/数组数据的大小引用?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 尽管一切看起来都很好,但值不会交换
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 在 C++11 中利用 int*_t、int_fast*_t 和 int_least*_t 之间的差异的一个很好的例子是
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 为什么指标有时效果很好,有时效果不佳?写下霍夫曼代码
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- 使用移位的无符号数字作为数组的索引号是一种很好的做法
- 是否很好地使用状态模式来维护当前选定的对象?
- C++|以一种很好的方式将树(不一定是二进制的)打印到stdout
- 静态库单独使用很好,但在引用时会抛出错误
- 如果验证容器的大小并在同一条件语句下访问元素,这是很好的做法吗?
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 有没有办法关闭文件? fclose 不能很好地工作
- 引用的静态强制转换强制模板实例化,其中不完整的类型很好
- libc++:为什么流关闭后仍然很好
- 不能很好地运行HElib,但它建立在Windows 10 x64上
- 为什么我用zlib没有得到很好的压缩