gpt4 book ai didi

c++ - 使用 gzip_compressor 产生不同的文件大小

转载 作者:行者123 更新时间:2023-11-28 03:21:06 25 4
gpt4 key购买 nike

我使用 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 的不同实现产生不同的文件大小

有什么想法吗?

最佳答案

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

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

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

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

关于c++ - 使用 gzip_compressor 产生不同的文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15405800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com