9

C#でdeflate / gzipストリームを使用しようとしていますが、圧縮後のファイルが以前よりも大きくなっているようです。

たとえば、900koのdocxファイルを圧縮しますが、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();
4

5 に答える 5

7

このような大きな違いは私には奇妙に思えますが、それ自体がZIPで圧縮されていることを覚えておく必要がありますdocx。したがって、再度圧縮する理由はありません。通常、結果は大きくなります。

于 2010-10-05T13:32:45.143 に答える
2

まず、deflate / gzipストリームは、zip、7zなどと比較した場合、圧縮が著しく劣ります。

第二に、docx(および末尾に「x」が付いたすべてのMSドキュメント形式)は、とにかく.zipファイルです。.docxの名前を.zipに変更して、煙とミラーを表示します。

したがって、docxに対してdeflate / gzipを実行すると、実際にはファイルが大きくなります。(これは、圧縮率の高いzipファイルに対して圧縮率の低いzipを実行するようなものです。)

ただし、HTMLやテキストファイルなどの圧縮されていないものに対してdeflate / gzipを実行すると、実際にはかなり良い仕事をします。

于 2010-10-05T13:39:25.690 に答える
0

確かに、他の人が示しているように、指定したサンプルファイルはすでに圧縮されています-最大の問題は、ほとんどの圧縮ユーティリティとは異なり、DeflateStreamクラスとGZipStreamクラスは、インテリジェンスなしでデータストリームをトークン化/圧縮しようとすることを理解することです。すべての追加トークン(オーバーヘッド)は、実際に必要なデータ量を増やしています。Zip、7zなどは、データが大部分がランダムなエントロピー(実質的に非圧縮)である場合、データをさらに圧縮しようとするのではなく、単に「現状のまま」(圧縮せずに保存)保存することを知っているほど賢いです。

于 2010-10-05T14:21:30.177 に答える
0

jpgデータを含むデータベースの圧縮でも同じ問題が発生しました。dotnetzipを試してみました-代わりにドロップして、まともな圧縮を取得しました(Compact Frameworkもサポートしています!):

MS : 10MB -> 10.0MB
DNZ: 10MB ->  7.6MB
于 2011-10-11T14:53:39.373 に答える
-2

GzipStreamとDeflateStreamはファイルを圧縮することを目的としているとは思いません。SharpZipLibのようなファイルコンプレッサーを使用すると、おそらく幸運が訪れるでしょう。

于 2010-10-05T13:32:55.783 に答える