0

我使用 gzip_compressor() 来压缩输出文件。为此,我使用了两种方法。共同的部分是

std::ofstream traceOut;
traceOut.open("log.gz", std::ios_base::out);
struct traceRec {
  traceRec(uint64_t c) : cycle(c) {};
  uint64_t cycle;
};
void writeTrace(traceRec &rec)
{
  boost::iostreams::filtering_ostream o;
  o.push(boost::iostreams::gzip_compressor());
  o.push(traceOut);
  // METHOD 1 OR 2
}

方法一

我用

 o.write(reinterpret_cast<const char*>(&rec.cycle), sizeof(rec.cycle));

使用此实现,文件大小为 380K!

方法二

我用

 traceOut << rec.cycle << std::endl;

使用此实现,文件大小为 78K!

那么为什么他们有不同的大小?另一件事是,如果我不使用 gzip_compressor 并直接写入文件

std::ofstream traceOut;
traceOut.open("log.gz", std::ios_base::out);
...
traceOut << rec.cycle << std::endl;

文件大小为 78K。

所以有两个问题:

1-使用或不使用gzip_compressor对文件大小没有影响

2-使用不同的实现gzip_compressor产生不同的文件大小

有什么想法吗?

4

1 回答 1

2

operator << 可能使用数字的文本表示,而 write 方法采用完整的变量大小。

因此,例如,如果您有一个“13”的周期,在“写入”的情况下,您将消耗 8 个字节,而在文本表示中您将仅消耗 2 个字节。

压缩后的效果更加显着,因为将数字写成文本时,只用到了 10 个字符,(熵非常低),所以冗余度和可压缩性都很高。

另一方面,如果您的循环计数器通常非常大(> 99999999),那么 write 方法将提供更好的压缩。

于 2013-03-14T09:51:49.697 回答