GZipStream и DeflateStream создают большие файлы
Я пытаюсь использовать потоки deflate/gzip в C#, но кажется, что файлы после сжатия больше, чем раньше.
Например, я сжимаю файл docx 900ko, но он производит 1.4Mo!
И он делает это для каждого файла, который я пробовал.
Может быть, я не прав в том, как я это делаю? Вот мой код:
FileStream input = File.OpenRead(Environment.CurrentDirectory + "/file.docx");
FileStream output = File.OpenWrite(Environment.CurrentDirectory + "/compressedfile.dat");
GZipStream comp = new GZipStream(output, CompressionMode.Compress);
while (input.Position != input.Length)
comp.WriteByte((byte)input.ReadByte());
input.Close();
comp.Close(); // automatically call flush at closing
output.Close();
5 ответов
Такая большая разница кажется мне странной, но вы должны иметь в виду, что docx
Сам архив сжимается в ZIP, поэтому нет смысла его снова сжимать, результаты обычно больше.
Во-первых, потоки deflate/gzip очень плохи при сжатии по сравнению с zip, 7z и т. Д.
Во-вторых, docx (и все форматы документов MS с 'x' в конце) в любом случае являются просто файлами.zip. Переименуйте.docx в.zip, чтобы показать дым и зеркала.
Поэтому, когда вы запускаете deflate/gzip поверх docx, он на самом деле увеличивает размер файла. (Это похоже на создание zip-файла с низким уровнем сжатия по сравнению с zip-файлом с высоким уровнем сжатия.)
Однако, если вы запустите deflate/gzip поверх HTML, текстового файла или чего-то, что не будет сжато, тогда это на самом деле будет довольно неплохо.
У меня была такая же проблема со сжатием баз данных, содержащих данные jpg. Я попробовал dotnetzip - капля замены и получил достойное сжатие (также поддерживает Compact Framework!):
MS : 10MB -> 10.0MB
DNZ: 10MB -> 7.6MB
Хотя это верно, как указывали другие, что указанные вами примеры файлов уже сжаты - самая большая проблема заключается в том, чтобы понять, что в отличие от большинства утилит сжатия классы DeflateStream и GZipStream просто пытаются токенизировать / сжимать поток данных без интеллекта, который все дополнительные токены (накладные расходы) фактически увеличивают объем требуемых данных. Zip, 7z и т. Д. Достаточно умны, чтобы знать, что если данные в значительной степени являются случайной энтропией (практически несжимаемой), то они просто хранят данные "как есть" (сохраняют, а не сжимают), вместо того, чтобы пытаться сжимать их дальше.
Я не думаю, что GzipStream и DeflateStream предназначены для сжатия файлов. Вам, вероятно, повезет больше с файловым компрессором, таким как SharpZipLib.