Я использовал gzip_compressor(), чтобы иметь сжатый выходной файл. Для этой цели я использовал два метода. Общая частьИспользование 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
выход другого размера файла
Любая идея о том, что ?
, так что вы имеете в виду, что для больших выходов лучше писать метод? Как насчет того же размера при использовании компрессора и не использовать его? – mahmood
Речь идет о требуемом размере кода для хранения значения. «13» требует 2 байта, а 0x000000000000000D требует 8 (это до сжатия). С другой стороны, для хранения «2434533376» требуется 10 байт, в то время как для бинарной формы по-прежнему требуется 8. – xryl669
Что касается использования компрессора, я не обнаружил никаких проблем, кроме того, что использовал бы «filtering_streambuf