簡體   English   中英

使用gzip_compressor會產生不同的文件大小

[英]Using gzip_compressor yield different file sizes

我用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不同實現產生不同的文件大小

有什么想法嗎?

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

因此,如果你有一個“13”的循環,在“寫”情況下,你將消耗8個字節,而你在文本表示中只消耗2個字節。

壓縮后,效果更加顯着,因為當將數字作為文本編寫時,只使用10個字符(非常低的熵),因此它是高度冗余和可壓縮的。

在另一個大小上,如果您的循環計數器通常非常大(> 99999999),那么write方法將提供更好的壓縮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM