GZipStream и DeflateStream создают большие файлы - PullRequest
9 голосов
/ 05 октября 2010

Я пытаюсь использовать потоки deflate / gzip в C #, но кажется, что файлы после сжатия больше, чем раньше.

Например, я сжимаю файл docx 900ko, но он выдает 1.4Mo one!

И он делает это для каждого файла, который я пробовал.

Может быть, я не прав в том, как я это делаю?Вот мой код:

  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 ]

7 голосов
/ 05 октября 2010

Такая большая разница кажется мне странной, но вы должны иметь в виду, что docx сам по себе сжимается в ZIP, поэтому нет смысла его снова сжимать, результаты обычно больше.

2 голосов
/ 05 октября 2010

Во-первых, потоки deflate / gzip очень плохи при сжатии по сравнению с zip, 7z и т. Д.

Во-вторых, docx (и все форматы документов MS с символом «x» в конце) в любом случае являются просто файлами .zip. Переименуйте .docx в .zip, чтобы показать дым и зеркала.

Таким образом, когда вы запускаете deflate / gzip поверх docx, он на самом деле увеличивает размер файла. (Это похоже на создание zip-файла с низким уровнем сжатия над zip-файлом с высоким уровнем сжатия.)

Однако, если вы запустите deflate / gzip поверх HTML, текстового файла или чего-то, что не будет сжато, тогда это на самом деле будет довольно хорошо.

0 голосов
/ 11 октября 2011

У меня была такая же проблема со сжатием баз данных, содержащих данные jpg.Я попробовал dotnetzip - капля замены и получил приличное сжатие (также поддерживает Compact Framework!):

MS : 10MB -> 10.0MB
DNZ: 10MB ->  7.6MB
0 голосов
/ 05 октября 2010

Хотя это верно, как указывали другие, что указанные вами примеры файлов уже сжаты - самая большая проблема заключается в том, чтобы понять, что в отличие от большинства утилит сжатия, DeflateStream и GZipStream классы просто пытаются токенизировать / сжимать поток данных, не зная, что все дополнительные токены (накладные расходы) фактически увеличивают объем требуемых данных. Zip, 7z и т. Д. Достаточно умны, чтобы знать, что если данные в значительной степени случайная энтропия (практически несжимаемая), то они просто хранят данные «как есть» (сохраняют, а не сжимают), вместо того, чтобы пытаться сжимать их дальше.

0 голосов
/ 05 октября 2010

Я не думаю, что GzipStream и DeflateStream предназначены для сжатия файлов.Вам, вероятно, повезет больше с файловым компрессором, например SharpZipLib .

...