我用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
}
方法1
我用
o.write(reinterpret_cast<const char*>(&rec.cycle), sizeof(rec.cycle));
通过此实现,文件大小为380K !!
方法2
我用
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
的不同实现会产生不同的文件大小
有任何想法吗?
答案 0 :(得分:2)
运营商&lt;&lt;可能使用数字的文本表示,而write方法采用完整的可变大小。
因此,如果你有一个“13”的循环,在“写”情况下,你将消耗8个字节,而你在文本表示中只消耗2个。
当压缩时,效果更加显着,因为当将数字作为文本写入时,只使用10个字符(非常低的熵),因此它是高度冗余和可压缩的。
在另一个尺寸上,如果您的周期计数器通常非常大(> 99999999),那么write方法将提供更好的压缩。