2013-03-14 4 views
0

Я использовал 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 выход другого размера файла

Любая идея о том, что ?

ответ

2

Оператор < <, вероятно, использует текстовое представление числа, в то время как метод записи принимает полный размер переменной.

Так что, если у вас есть, например, цикл «13», в случае «записи» вы будете потреблять 8 байт, в то время как вы будете потреблять только 2 в текстовом представлении.

При сжатии эффект еще более драматичен, поскольку при записи чисел в виде текста используется только 10 символов (очень низкая энтропия), поэтому он очень избыточный и сжимаемый.

На другом уровне, если ваш счетчик циклов часто очень большой (> 99999999), тогда метод записи даст лучшее сжатие.

+0

, так что вы имеете в виду, что для больших выходов лучше писать метод? Как насчет того же размера при использовании компрессора и не использовать его? – mahmood

+0

Речь идет о требуемом размере кода для хранения значения. «13» требует 2 байта, а 0x000000000000000D требует 8 (это до сжатия). С другой стороны, для хранения «2434533376» требуется 10 байт, в то время как для бинарной формы по-прежнему требуется 8. – xryl669

+0

Что касается использования компрессора, я не обнаружил никаких проблем, кроме того, что использовал бы «filtering_streambuf » и имел бы поток в потоке, pop() и reset() в конце. – xryl669

Смежные вопросы